c++拷贝构造函数与赋值运算

来源:互联网 发布:淘宝助理5.8图片搬家 编辑:程序博客网 时间:2024/06/07 19:09

在C++中,我们写一个class后,如果自己没有声明,那么编译器就会为它声明(编译器版本的)一个拷贝构造函数、一个拷贝赋值操作符和一个析构函数。此外,如果我们没有声明任何构造函数,编译器也会为我们声明一个default构造函数。所有这些函数都是public且inline的。

class Empty{};
class Empty{public:    Empty(){...};    Empty(const Empty& rhs){...};    ~Empty(){...};    Empty& operator=(const Empty& rhs){...};};

所以你写下上面的代码,就好像你写下了下面的代码。当这些函数被调用时,它们才会被编译器创建出来。
如果我们自己声明了构造函数,那么编译器就不再为它创建default构造函数了。

#include <iostream>#include <string>template<typename T>class NamedObject {public:    NamedObject(const char* name, const T& value);    NamedObject(const std::string& name, const T& value);    void showObject();private:    std::string nameValue;    T objectValue;};template<typename T>NamedObject<T>::NamedObject(const char* name, const T& value) {    nameValue = name;    objectValue = value;}template<typename T>NamedObject<T>::NamedObject(const std::string& name, const T& value) {    nameValue = name;    objectValue = value;}template<typename T>void NamedObject<T>::showObject() {    std::cout << "The name is: " << nameValue << std::endl;    std::cout << "The value is: " << objectValue << std::endl;}int main() {    NamedObject<int> no1("Haha", 2);    NamedObject<int> no2(no1);    no1.showObject();    no2.showObject();    system("pause");    return 0;}

最后运行的结果如下:

这里写图片描述

编译器生成的拷贝构造函数帮我们完成了初始化。no2.nameValue的初始化方式是调用string的copy构造函数并以no1.nameValue为实参。另一个成员NamedObject<int>::objectValue的类型为int,那是一个内置类型,所以no2.objectValue会以拷贝no1.objectValue内的每一个bit来完成初始化。

参考资料:《Effective C++ 中文版》第三版

1 0
原创粉丝点击