一、为什么需要构造函数?
普通对象创建后,成员变量是随机垃圾值,需要手动赋值,繁琐且不安全。构造函数 :对象创建时自动调用 ,专门用于初始化成员属性。析构函数 :对象销毁时自动调用,专门用于释放资源。
二者都是系统自动触发,无需手动调用。
二、构造函数 核心规则
- 函数名必须和类名完全相同
- 无返回值、不写
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