构造函数与析构函数完全指南
一、为什么需要构造函数普通对象创建后成员变量是随机垃圾值需要手动赋值繁琐且不安全。构造函数对象创建时自动调用专门用于初始化成员属性。析构函数对象销毁时自动调用专门用于释放资源。二者都是系统自动触发无需手动调用。二、构造函数 核心规则函数名必须和类名完全相同无返回值、不写void对象实例化时自动执行一次可重载、可带参数、可多个1. 默认构造函数无参构造无参数编译器默认提供一旦自定义构造编译器不再生成默认构造。class Person { private: string name; int age; public: // 无参构造函数 Person() { name 未知; age 0; cout 无参构造函数调用 endl; } void show() { cout name age endl; } };创建对象自动执行Person p; // 自动调用无参构造2. 有参构造函数用于创建对象时直接初始化数据省去 set 赋值。Person(string n, int a) { name n; age a; cout 有参构造函数调用 endl; }调用方式Person p2(张三, 18);3. 构造函数重载一个类可以存在多个构造参数个数 / 类型不同适配不同初始化场景。// 无参 Person(){} // 单参数 Person(string n){ name n; } // 多参数 Person(string n, int a){ name n; age a; }三、拷贝构造函数作用用已有对象快速复制生成一个全新对象属性完全一致。规则参数为本类const 引用格式固定类名(const 类名 obj)Person(const Person p) { this-name p.name; this-age p.age; cout 拷贝构造调用 endl; }触发场景Person p1(李四,20); Person p2 p1; // 自动调用拷贝构造四、析构函数 核心规则函数名~类名()加波浪号无参数、无返回值、不能重载对象销毁时自动执行核心用途释放堆内存、关闭文件、清理资源~Person() { cout 析构函数调用 endl; }栈对象出作用域自动调用析构堆对象delete时触发析构五、this 指针配套必懂this指向当前对象本身解决成员变量与形参重名冲突格式this-成员名Person(string name, int age) { this-name name; this-age age; }六、完整综合代码示例#include iostream #include string using namespace std; class Person { private: string name; int age; public: // 无参构造 Person() { name 默认用户; age 0; cout 无参构造执行 endl; } // 有参构造 Person(string name, int age) { this-name name; this-age age; cout 有参构造执行 endl; } // 拷贝构造 Person(const Person p) { this-name p.name; this-age p.age; cout 拷贝构造执行 endl; } // 展示信息 void showInfo() { cout 姓名 name 年龄 age endl; } // 析构函数 ~Person() { cout 析构函数执行对象销毁 endl; } }; int main() { Person p1; p1.showInfo(); Person p2(王五, 19); p2.showInfo(); Person p3 p2; p3.showInfo(); return 0; }七、栈对象 堆对象 构造析构区别栈对象生命周期随作用域离开大括号自动析构。堆对象cpp运行Person *p new Person(赵六,21); delete p; // 手动释放触发析构不 delete → 不执行析构 → 内存泄漏。八、高频易错点自定义有参构造后丢失默认无参构造报错构造函数写返回值、加 void语法错误析构函数写参数、重载非法拷贝构造不使用引用引发无限递归堆对象不 delete资源无法释放九、核心总结构造函数创建对象自动执行负责初始化分类无参、有参、拷贝构造支持重载析构函数销毁对象自动执行负责资源释放this 指针区分重名变量代表当前对象栈对象自动回收堆对象必须手动 delete