摘要探索编程世界中的生命循环:构造函数如同新生,析构函数则如告别。我们一起通过一个生动的比喻与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;
}

运行结果

C++基本语法:构造函数和析构函数_构造函数

总结

  • 构造函数,在对象被创建时自动调用
  • 析构函数,在对象被销毁时自动调用
  • 每个对象都有构造函数和析构函数。如果你不写,系统会自动调用空函数。