之前我们聊过类的基本用法,现在来看看编译器自动生成的那几个函数——它们到底做了什么,以及什么时候必须自己动手。
在一个类中,如果你没有显式编写,编译器通常会默认生成以下四个重要的成员函数:
- 默认构造函数
- 析构函数
- 拷贝构造函数
- 赋值运算符重载

深入这些函数,需要从两个维度来考虑:第一,了解编译器自动生成的默认函数行为,在哪些场景下能正常工作;第二,当默认行为不够用的时候,知道如何自己实现。
构造函数
构造函数就像产品的'出厂设置'。你根据图纸(类)生产出一个新零件(对象)时,构造函数会自动运行,负责初始化对象的状态——比如赋初值、分配内存等。注意:构造函数并不负责开辟对象的内存空间,那是由栈帧完成的;它只做初始化。
核心语法
#include <iostream>
using namespace std;
class Student {
public:
int age;
Student() {
age = 18;
cout << "调用了默认构造函数" << endl;
}
};
int main() {
Student s1;
cout << s1.age << endl;
return 0;
}
要点:函数名与类名相同,没有返回值(void 也不写),声明对象时自动调用,不能手动像 s1.Student() 这样调。参数可有可无。
常见形式
无参构造函数、带参构造函数、全缺省构造函数。全缺省和无参不能同时存在,因为不传参数时会有歧义。
class Date {
public:
Date() : _year(1), _month(1), _day(1) {} // 无参
Date(int year, int month, int day) { ... }
( year = , month = , day = );
};


