摘要:探索编程世界中的生命循环:构造函数如同新生,析构函数则如告别。我们一起通过一个生动的比喻与C++示例,来展示对象诞生与消亡的隐形调用,提高你对 C++ 中类与对象的理解。
理解构造函数与析构函数的意义
我们生活中的很多东西对有开机设置和格式化功能。
比如我们新买了一个iPhone16,那么在第一次使用时,我们则需要对其进行开机设置。比如选择我们的国家与地区、设置手机的语言、登录我们的Apple ID。这个操作,就类似于我们的构造函数——它在对象被创建的时候执行,且只执行一次(毕竟,我们也不希望每天起床时,都要重新设置一下各种东西)
而当我们这个手机不要了,我们想将其出售的时候,我们肯定也希望我们的私人数据全部清除,让手机回到一个干净的状态。这,就类似析构函数。它在对象被销毁的时候执行,而且也只执行一次。
学习构造函数与析构函数的语法规则
构造函数
- 没有返回值(因为它默认就没有返回值,所以不需要使用void去告诉编译器它没有返回值,直接就不写)
- 函数名与类名相同
- 可以有形参(所以也可以重载)
- 在对象被创建时,自动调用构造函数,且只调用一次
- 每个对象都有构造函数。如果你自己不写,系统则会调用一个函数体为空的构造函数。
//构造函数的基本形式
类名(形式参数列表)
{
;//函数体
}
析构函数
- 同样没有返回值
- 函数名为 ~ + 类名,如类名为 Peolpe,则它的析构函数名为 ~People
- 不可以有形参(所以它不能重载,否则会引发二义性)
- 在对象被销毁时,自动调用,且只调用一次
- 每个对象都有析构函数。如果你自己不写,系统则会调用一个函数体为空的析构函数。
//析构函数的基本形式
~类名()
{
;//函数体
}
辨析构造函数与析构函数
通过对比,我们发现构造函数和析构函数其实有很多相同的特性,而有 3 点不同:
- 构造函数在对象诞生时调用,而析构函数在对象死亡时被调用
- 析构函数没有形参,而构造函数可以有
- 析构函数的函数名前,比构造函数多了一个 “~”
代码示例
#include <iostream>
using namespace std;
//我们写一个类,来测试一下构造函数和析构函数
//主要测试:
// 1.语法规则
// 2.是否为程序自动调用
class CellPhone
{
public:
//构造函数 —————— 对象被创建时,自动执行
CellPhone()
{
cout << "CellPhone 构造函数的调用测试" << endl;
}
//析构函数 —————— 对象被销毁时,自动执行
~CellPhone()
{
cout << "CellPhone 析构函数的调用测试" << endl;
}
};
void Text()
{
CellPhone c;
}
int main()
{
//因为析构函数是在对象销毁时才会执行
// 所以,为了测试析构函数
// 我们选择新建一个测试函数,然后在测试函数中去调用对象
// 这样,当测试函数出栈时,里面的CellPhone就会自动销毁
// 从而自动调用它的析构函数
Text();
return 0;
}
运行结果
总结
- 构造函数,在对象被创建时自动调用
- 析构函数,在对象被销毁时自动调用
- 每个对象都有构造函数和析构函数。如果你不写,系统会自动调用空函数。