编译器为类创建的所有成员函数是什么?这会一直发生吗?

Onn*_*esh 58 c++ c++-faq member-functions

编译器为类创建的所有成员函数是什么?这会一直发生吗?像析构函数.我担心的是它是否为所有类创建,为什么需要默认构造函数?

sbi*_*sbi 85

C++ 98/03

如果需要,

  1. 除非您声明自己的任何构造函数,否则编译器将为您生成默认构造函数.
  2. 除非你声明自己的,否则编译器会为你生成一个复制 构造函数.
  3. 编译器将为您生成一个复制 赋值运算符,除非您声明自己的运算符.
  4. 除非你声明自己的析构函数,否则编译器会为你生成一个析构函数.

彼得在一个有用的评论说,所有这些都只能由编译器产生在需要的时候.(所不同的是,当编译器不能创建它们,那也行,只要他们不使用.)


C++ 11

C++ 11增加了如下规则,这些规则也适用于C++ 14 (学分towi,看到此评论):

  • 编译器生成移动 构造函数 if
    • 没有用户声明的复制 构造函数,和
    • 没有用户声明的复制 赋值运算符,和
    • 没有用户声明的移动 赋值运算符
    • 没有用户声明的析构函数,
    • 没有标记为已删除,
    • 所有成员和基地都是可移动的.
  • 移动 赋值运算符类似:如果没有用户定义,则生成它
    • 没有用户声明的复制 构造函数,和
    • 没有用户声明的复制 赋值运算符,和
    • 没有用户声明的移动 构造函数
    • 没有用户声明的析构函数,
    • 没有标记为已删除,
    • 所有成员和基地都是可移动的.

请注意,这些规则比C++ 03规则更精细,在实践中更有意义.

为了更容易理解上面的内容,请参阅以下内容delete:

class Thing {
public:
    Thing();                        // default constructor
    Thing(const Thing&);            // copy c'tor
    Thing& operator=(const Thing&); // copy-assign
    ~Thing();                       // d'tor
    // C++11:
    Thing(Thing&&);                 // move c'tor
    Thing& operator=(Thing&&);      // move-assign
};
Run Code Online (Sandbox Code Playgroud)

而进一步阅读,如果你是一个C++ - 初学者考虑一个设计,不要求你实现过去的五个,即零规则 (由Martinho Fernandes).

  • 为了精确起见,所有这些仅在实际需要时生成,而不是始终.例如,仅当存在对所讨论的类的实例进行实际分配时才生成赋值运算符. (6认同)