文章目录
引言
C++ 类的默认成员函数是面向对象编程的核心基础,编译器会在用户未显式定义时自动生成这些函数。 其中构造函数、析构函数等核心函数直接决定了对象的创建、初始化与销毁逻辑。 理解这些函数的默认行为,以及在其无法满足需求时如何自定义实现,是掌握 C++ 类设计的关键。
一、类的默认成员函数
默认成员函数是在用户没有显式实现,编译器会自动生成的成员函数。
在一个类,编译器会默认生成六个默认成员函数。(前 4 个默认成员函数比较重要,后面的两个取地址重载了解即可)
在 C++11 还会增加两个默认成员函数,移动构造和移动赋值。
对于默认成员函数的学习,尤其重要且复杂,需要围绕以下两个方面:
- 不显式写成员函数,编译器默认生成的函数行为是什么,能否满足我们的需求!?
- 编译器默认生成的函数不满足需求,需要我们如何去实现!?
二、构造函数
构造函数是特殊的成员函数,要注意:虽然名字叫构造,但是构造函数不是来开辟空间创建对象的(像局部对象在栈帧创建时就开好了),而是在实例化对象时初始化对象。
构造函数本质是为了替代之前在 Stack、Data 类中的 Init 函数,其特点防止人为忘记初始化,是完美的替代品。
2.1 解析:构造函数的独特之处
- 函数名称与类的名称相同;
- 构造函数可以重载;
- 当对象实例化,系统会自动调用对应的构造函数;
- 构造函数没有返回值(C++ 规定不需要写返回值、返回类型);
- 如果类中没有显式定义出构造函数,则 C++ 编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
- 默认构造函数包含:无参构造函数、全缺省构造函数、编译器默认生成的构造函数,但是三者只存在一个。其中无参、全缺省虽然构成函数重载,但是会调用歧义。(总结:不传实参就可以调用的构造就是默认构造)
- 默认生成的构造函数对内置类型的成员变量没有初始化的要求。对于自定义类型的成员变量,会调用这个成员变量的默认构造函数。如果没有默认构造函数,就报错。(初始化成员变量需要初始化列表才行,后面会有)


