Know what functions C++ silently writes and calls
关于类的构造、析构、和拷贝构造、拷贝赋值函数
如果自定义类时没有创建构造函数、析构函数、拷贝构造函数和拷贝赋值函数,编译器会默认为类创建;
copy构造函数和copy赋值函数,编译器创建的版本只是简单地将类中每一个non-static对象拷贝到目标对象;
问题
- 类中的成员变量为引用类型,此时使用默认函数容易出错;
1 | template<class T> |
- 倘若该例子没有错,那么p.nameValue和s.nameValue是否指向同一个string呢?如果指向同一个对象,你们就意味着reference被改变了,但是C++不允许reference改变指向不同的对象;
- 此时,编译器会拒绝编译这一行的赋值;
同理,对面对const成员变量也一样。由于更改const是不合法的,因此编译器也会拒绝进行赋值;
如果某个基类将copy赋值函数声明为private的,那么编译器会拒绝为派生类生成一个copy赋值函数,因为编译器需要权限去处理基类的成分(在编译时,编译器会假设copy赋值函数需要处理基类的成分)。
提醒
- 编译器会暗自创建构造函数、析构函数、拷贝构造函数和拷贝赋值函数;