【条约5】know what functions C++ silently writes and calls

【条款5】know what functions C++ silently writes and calls如果没有为一个类声明construct function、copy

【条款5】know what functions C++ silently writes and calls

如果没有为一个类声明construct function、copy construct function、copy assignment function、destruct function,编译器就会为之声明默认版本。

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

注意:1、这些默认版本的函数都是public and inline;

    2、只有当这些函数被调用时,才会被编译器创建出来。

然而,在某些情况下,需要自己实现这些函数,否则无法实现程序的本意。这就是C++中最容易出问题的地方,也恰恰是其迷人之处。这些情况包括:

1、涉及到资源分配;

2、涉及到const成员、引用等。

在《C++ Primer》中,第13章“复制控制”专门讲解了相关的内容。

所谓的资源分配就是指类的数据成员中有指针类型,这时候就需要进行深拷贝,而默认版本的copy construct 只能完整深拷贝。这时候就需要自己编写“复制控制”的相关函数。

对于const 数据成员,由于const属性,该成员不可以被更改,所以default copy construct是非法的;而引用,同样也不可以让其改指不同的对象。

如果有以上情况出现,而有没有自己定义复制控制,编译器就会拒绝编译。

还有一种情况编译器也会拒绝编译:基类将copy assignment操作符声明为private,编译器将拒绝为其派生类生成一个copy assignment操作符