首页 > 代码库 > Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数

Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数

一、如果用户没有提供构造函数、copy构造函数、copy assignment操作符和析构函数,当且仅当这些函数被需要的时候,编译器才会帮你创建出来。编译器生成的这些函数都是public且inline。

  当你写下这样一个类的时候:

class Empty {};

  如果上述的函数是被需要的话,那么编译自动会帮你把类修改为,如下:

class Empty{public:    Empty() {...};    //这里进行数据成员的默认初始化,如果有虚函数的话,这里还会配置好虚函数表    Empty(const Empty& rhs) {…}    ~Empty() {..} //这里先对数据成员析构,然后销毁虚函数表等    Empty& operator=(const Empty& rhs) {...}};

  有待在inside c++ object model中细致考证(注:其实对于copy构造函数、赋值操作符重载,并不是你自己没有编写,当需要被调用的时候就被生成!如果编译器判断这个类的需要生成的copy构造函数等是trival,平凡的copy构造函数,那么编译器也不会生成copy‘构造函数等,只会在其需要copy构造函数的或者赋值操作符重载的地方,施行逐位拷贝)

二、注意,编译器产出的析构函数是个non-vitual,除非这个class的base class自身声明有virtual析构函数。

三、注意,在一个“内含reference成员”的class内支持赋值操作,必须自己定义copy assignment操作符。对于“内含const成员”的class,同样如此。

  不然编译器会提示:

non-static reference member ‘std::string& A::m_name’, can’t use default assignment operator

或者

non-static const member ‘const string A::m_name’, can’t use default assignment operator

四、如果某个base class将copy assignment操作符声明为private,编译器将拒绝为其derived class 生成一个copy assignment操作符。

Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数