C++ 构造函数与析构函数
一、构造函数Constructor1. 定义构造函数是类的特殊成员函数在创建对象时由系统自动调用用于完成对象的初始化工作如给成员变量赋值、分配内存、打开资源等。2. 语法特征函数名必须与类名完全相同没有返回值类型也不能写void可以有参数可以重载不能定义为const/virtual除拷贝构造外若用户未定义编译器会自动生成一个公有无参默认构造函数函数体为空若用户定义了任意构造函数编译器不再生成默认构造3. 分类默认构造函数无参数的构造函数。cpp运行class A { public: A() { x 0; } private: int x; };带参数构造函数用于创建对象时传入初始值。cpp运行class A { public: A(int val) { x val; } private: int x; }; A a(10);拷贝构造函数用一个已存在的同类型对象初始化新对象。原型固定cpp运行A(const A other);调用场景对象以值传递传入函数函数以值返回对象用对象初始化新对象移动构造函数C11用于转移临时对象资源提高效率。cpp运行A(A other);4. 初始化列表高效初始化方式构造函数可使用初始化列表直接初始化成员比在函数体内赋值效率更高。cpp运行class A { public: A(int a, int b) : x(a), y(b) {} private: int x, y; };5. 调用时机定义栈对象时创建堆对象new时函数值传递 / 值返回时显式拷贝对象时二、析构函数Destructor1. 定义析构函数是类的特殊成员函数在对象生命周期结束时自动调用用于释放对象占用的资源如堆内存、文件句柄、网络连接、锁等。2. 语法特征函数名~ 类名无返回值、无参数不能重载一个类只能有一个析构函数若未定义编译器自动生成公有的空析构函数基类析构函数通常声明为virtual防止内存泄漏3. 调用时机栈对象离开作用域时堆对象执行delete时程序结束时全局 / 静态对象销毁临时对象生命周期结束4. 重要规则如果类中有动态分配内存new必须手动写析构函数delete基类析构建议为virtual否则子类析构可能不执行析构顺序与构造顺序相反先构造的后析构三、构造 析构 执行顺序构造顺序基类构造成员对象构造自身构造析构顺序自身析构成员对象析构基类析构四、完整示例cpp运行#include iostream using namespace std; class Test { public: // 构造函数 Test() { cout 默认构造 endl; data new int[10]; } Test(int x) { cout 带参构造: x endl; } // 拷贝构造 Test(const Test t) { cout 拷贝构造 endl; } // 析构函数 ~Test() { cout 析构函数 endl; delete[] data; } private: int* data; }; void func(Test t) {} int main() { Test t1; Test t2(20); Test t3 t1; func(t2); return 0; }五、一句话核心总结构造函数对象创建时自动调用负责初始化、分配资源析构函数对象销毁时自动调用负责释放资源、清理工作构造可以重载析构不能重载有动态内存必须手写析构否则会内存泄漏