编译器为一个空类声明一个拷贝构造函数、一个拷贝赋值操作符和一个析构函数,如果没有声明任何构造函数,编译器也会声明一个默认构造函数,所有的这些函数都是public且inline
因此,如果写下:
class Empty{};
等价于:
class Empty{
public:
Empty(){...}
Empty(const Empty&rhs){...}
~Empty(){...}
Empty& operator=(const Empty&rhs){...}
};
唯有这些函数被调用,才会被编译器创建
如:
Empty e1;//default构造函数
//析构函数
Empty e2(e1);//copy构造函数
e2=e1;//copy assignment 操作符
**注意:**编译器产出的析构函数是个非虚的,除非这个类的基类自身声明有虚析构函数。拷贝构造函数和拷贝赋值操作符,编译器创建的版本只是单纯地将对象的非静态成员变量拷贝到目标对象。
假设有类NameObject定义如下:其中nameValue是一个string的引用类型,objVal是一个const int 类型,倘若创建对象并进行赋值操作,编译器生成的赋值函数能改动引用吗?
答案是不行,C++拒绝编译那一行赋值动作,如果要在含引用成员的class内支持赋值操作,必须自己定义赋值操作符,同时,更改const 成员也是不合法的。还有一种情况是:基类的赋值操作符是private的,编译器不会为派生类生成赋值操作符,因为无法处理基类的成分