EffectiveC++详解:条款05-了解C++默默编写并调用哪些函数

文章目录

  • 条款05-了解C++默默编写并调用哪些函数
    • 当我们写了一个空类,意味着什么
    • 编译器什么时候拒绝生成拷贝赋值运算符
    • 总结

@Author:CSU张扬
@Email:[email protected] or [email protected]
@我的网站: https://www.cppbug.com

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

当我们写了一个空类,意味着什么

当我们定义一个空类时,编译器会为我们自动声明拷贝构造函数拷贝赋值运算符析构函数,若你没有声明任何构造函数,编译器会声明一个默认构造函数,这些函数都是 publicinline

例如我们定义一个空类:class Empty { };,等同于下面这段代码:

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

注意:

  1. 编译器合成的析构函数是 non-virtual 的。
  2. 对于拷贝构造函数和拷贝赋值运算符,编译器合成的版本只是单纯的将对象每个 non-static 成员拷贝到目标对象。

编译器什么时候拒绝生成拷贝赋值运算符

  1. 类的成员变量是 引用 类型时。因为C++不允许改变引用的对象。
  2. 类的成员变量是 const 类型时。因为C+++不允许修改常量。
  3. 基类的拷贝赋值运算符声明为 删除的(C++11) 或者 private 的,那么编译器拒绝为它的派生类生成拷贝赋值运算符。因为 若生成了拷贝赋值运算符,派生类的拷贝赋值运算符同时也会处理基类部分的成员变量,而基类没有该函数,所以没办法赋值。

总结

  • 编译器会暗自为类声明拷贝构造函数拷贝赋值运算符析构函数默认构造函数

你可能感兴趣的:(EffectiveC++详解)