六个默认函数:
- 初始化和清理:
1️⃣构造函数:主要完成初始化工作
2️⃣析构函数:主要完成清理工作
2.拷贝复制
3.取地址重载
一、构造函数:
其特征如下:
- 函数名与类名相同
- 无返回值(也不需要写void)
- 对象实例化时编译器自动调用
- 可以重载(因为函数有多种初始化方式)
- 如果类中没有显示写构造函数,那么编译器会自动生成一个无参的默认构造函数,用户显示定义就不会生成

- 1️⃣一般情况下有内置类型成员,就需要自己写构造函数,不能用编译器自己生成2️⃣全部都是自定义类型成员,可以考虑让编译器自己生成
结论:
1.一般情况下,构造函数都需要我们自己写
2. a.内置类型成员都有缺省值,且初始化符合我们的要求不需要写
例如:
struct TreeNode
{
TreeNode* _left;
TreeNode* _right;
int val;
};
class Tree
{
private:
TreeNode* _root;
};
b.全是自定义类型的构造,且这些类型都定义默认构造
二、析构函数:
其特征如下:
- 无参数无返回值
- 一个类只能有一个析构函数,析构函数不能重载
- 对象生命周期结束时,编译器自动调用析构函数(1.内置类型成员不做处理2.自定义类型会去调用他的析构函数)
什么情况下需要我们自己写析构???
- 一般情况下,有动态申请内存(如栈),就需要显示写析构函数释放资源
- 没有动态申请的资料不需要写析构

- 需要释放资源的成员都是自定义类型,不需要写析构

三、拷贝函数:
-
拷贝构造函数是构造函数的一个重载形式
-
拷贝构造函数的成参数只有一个且必须是类类型对象的引 用,使用传值方式编译器会直接报错,因为会发生无穷递归

Date d2(d1) → 调用 Date(Date& d) → d 是 d1 的别名,直接操作原对象,不拷贝 → 正常完成 d2 的初始化最好加一个const这样写反了就可以检查出来:

#include<iostream> using namespace std; class Date { public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; } void Init(int year, int month, int day) { _year = year;//这里的_year是this->year,是d2的year _month = month; _day = day; } void Print() { cout << this << endl; cout << _year << "-" << _month << "-" << _day << endl; } Date(const Date& d) { _year = d._year; _month = d._month; _day = d._day; } private: int _year; int _month; int _day; }; int main() { Date d1(2026,6,12); Date d2(d1); return 0; }
注意:
- 内置类型成员完成值拷贝/浅拷贝
- 自定义类型成员会调用他的拷贝构造

浅拷贝问题:1️⃣析构两次报错2️⃣一个修改会影响另一个
这种情况如果不自己写拷贝函数,函数调用结束调用析构函数的时候会释放两次同一片空间
解决方法:重新开辟一个空间(深拷贝)