一个类一般都包含有构造,析构,copy构造以及copy assignment(也就是operator=)函数,如果用户没有自己声明其中的某一个函数,那么编译器就自动为它声明一个default的函数。这个函数是public并且inline的。不过编译器也很偷懒,它只会在需要这些函数时才会自动去创建它。
那么这些default函数都干了些什么呢?default构造和析构函数主要给编译器一个地方来放置“藏身幕后”的代码的,比如调用base classes和non-static成员变量的构造函数和析构函数。注意default析构函数除非base class的析构是virtual的,否则都是virtual的。而如果你已经自己定义了一个构造函数,那么编译器将不再为你自动生成default构造函数来掩盖掉你自己的版本。
而copy构造函数和copy assignment函数只是单纯的将所有每一个non-static成员变量拷贝至目标对象。copy构造函数会“拷贝原对象内的每一个bits”到目标对象内来完成初始化。而copy assignment函数基本类似,唯一不同的是需要符合:代码合法且有适当机会证明其有意义,才可以通过编译。什么意思呢?请看下面的代码:
那么我们发现如果赋值,那么其中的引用namevalue就可以更改了,就是说引用是可以指向不同的对象,那当然是不行的,所以编译器会拒绝这一行为,报错。同样如果类中有const成员,也无法通过编译器。另外,如果base class的copy assignment函数为private,那么derived class无法自动生成copy assignment函数,因为base class 的部分无法修改(被private修饰了)