-
常见的默认构造函数,默认拷贝构造,默认拷贝赋值运算
#include <iostream> using namespace std; class Empty{}; //空类 int main() { Empty e1; //调用e1的默认构造函数 Empty e2(e1);//调用e2的默认拷贝构造函数 e2 = e1; //调用e2的默认拷贝赋值运算符 return 0; }
- 当在main中有如上代码,类Empty中什么都没有写,但main中却可以调用默认构造,拷贝构造,赋值这三种操作。这是因为编译器为我们写了这些函数。
- 相当于main中的调用,会让Class Empty从空类变为了下面这样
class Empty{ public: Empty() {/******/} Empty(const Empty& rhs) {/******/} ~Empty() {/******/} };
- 注:所有编译器产生的函数都是public的
-
拷贝赋值出错情况
参考:https://blog.youkuaiyun.com/qq_41453285/article/details/104165762
- 拷贝赋值运算符的错误注意事项
有一种情况会导致出错,见下面的演示案例
template<typename T> class NamedObject { public: //因为name变为了string引用类型,因此参数1位char*类型的构造函数就没有用了 NamedObject(std::string& name, const T& value); private: //此处将name改为了引用形式,objectValue改为了const类型 std::string& name; const T objectValue; }; std::string newDog("Persephone"); std::string oldDog("Satch"); NamedObject<int> p(newDog, 2); NamedObject<int> s(oldDog,36); p = s; //错误
上述“p=s”错误的原因:
- name:因为name为引用类型了,我们知道引用一旦绑定就不可以改变引用指向,但是在此处拷贝赋值运算符中,我们将p的name引用从一开始指向于newDog又指向了oldDog,因此会发生错误(引用的绑定不可被修改)
- objectValue:因为objectValue为const类型,因此在初始化之后其值就不可以改变了,此处将p的值从2改变为36因此会发生错误(const值不可修改)