Item 5 详解:看透编译器自动生成的那些函数

Effective C++ Item 5 详解:看透编译器自动生成的那些函数

当你写下一个空类时,C++ 编译器会悄悄为你做很多事。比如:

class Empty {};

你以为这是一个 “空” 类,但编译器会自动为它生成 4 个特殊成员函数:默认构造函数、析构函数、拷贝构造函数和拷贝赋值运算符。《Effective C++》Item 5 的核心就是:了解这些编译器自动生成的函数的行为、生成条件及潜在风险。本文将深入解析这 4 个函数,告诉你何时该依赖编译器,何时必须亲手实现。

一、编译器自动生成的 4 个 “默认函数”

C++ 编译器遵循 “最小必要” 原则:只有当代码中确实需要某个特殊函数时,编译器才会生成它。这 4 个函数的生成逻辑和行为各有特点,我们逐一拆解。

1. 默认构造函数(Default Constructor)

作用:无参构造函数,用于创建对象时未提供参数的场景(如Empty e;)。

生成条件:当类没有定义任何构造函数时,编译器才会生成默认构造函数。一旦你手动定义了任何构造函数(哪怕是带参的),编译器就不再生成默认构造函数。

注意点

编译器生成的默认构造函数会调用基类和非静态成员的默认构造函数(如果它们有的话)。

若类中包含 “没有默认构造函数的成员”(如class A { public: A(int); };),编译器将无法生成默认构造函数,此时若代码中需要无参构造对象,会直接编译报错。


class A {

public:

A(int x) {} // 手动定义带参构造函数

};

class B {

A a; // 成员a没有

你可能感兴趣的:(Item 5 详解:看透编译器自动生成的那些函数)