Effective C++ 条款 —— 了解C++默默编写并调用哪些函数

  • 定义一个类时,如果自己没有显式声明,那么编译器就会为它声明编译器版本的一个默认构造函数、一个拷贝构造函数、一个拷贝赋值运算符和一个析构函数。唯有当这些函数被需要(被调用)时,它们才会被编译器创建出来,而且它们都是public的。
  • 编译器版本的默认构造函数会调用 base classnon-static 成员变量的默认构造函数,而编译器版本的析构函数也将调用 base class 和 non-static 成员变量的析构函数。
  • 而且,编译器创建的析构函数是non-virtual的,除非这个class的base class自身声明有virtual析构函数。
  • 至于拷贝构造函数和拷贝赋值运算符,编译器创建的版本只是简单地将源对象的每一个non-static成员变量拷贝到目标对象(此过程中会调用相应成员的拷贝构造函数/拷贝赋值运算符)。
    • 如果你打算在一个 “内含reference成员”“内含const成员” 的class内支持赋值操作,你就必须自己定义拷贝赋值运算符!因为C++不允许“让reference改指向不同对象”,也不允许修改const对象,编译器对此也无能为力。

    • 如果某个base class将拷贝赋值运算符声明为private, 编译器将拒绝为其derived classes 生成一个拷贝赋值运算符。毕竟编译器为derived classes所生成的拷贝赋值运算符想象中可以处理base class成分,但它们当然无法调用derived class无权调用的成员函数。

猜你喜欢

转载自blog.csdn.net/fcku_88/article/details/88430007