【C++】构造函数与析构函数用途 ( 代码示例 - 构造函数与析构函数用途 )





一、构造函数与析构函数



在 C++ 语言中 , " 构造函数 " 和 " 析构函数 " 都是 C++ 类中的 特殊函数 , 分别用于

  • 初始化对象
  • 销毁对象 ;

C++ 类 在创建 实例对象 时自动调用 构造函数 这个特殊函数 , 其主要作用是 初始化对象的成员变量 , 如果需要 可以 执行其他必要的操作 ;

  • 构造函数 的名称与类的名称相同 ;
  • 构造函数 没有返回类型 ;
  • 构造函数 可以带有参数 , 也可以不带参数 ;

C++ 类 在 销毁 实例对象 时自动调用 析构函数 这个特殊函数 , 其主要作用是 销毁释放对象的成员变量 , 如果需要 可以 执行其他必要的操作 ;

  • 析构函数 的名称 是 ~ 加上 类的名称 ;
  • 析构函数 没有返回类型 ;
  • 析构函数 不带参数 ;




二、代码示例 - 构造函数与析构函数用途



在下面的代码中 :

C++ 类 Student 类 有 2 个 public 共有成员变量 ,

public:
	int age;
	char* name;

在 构造函数 中 , 需要初始化这两个成员变量 , 其中涉及到为 char* name 指针 在堆内存 分配内存 , 并为其设置 初始化值 ;

在 构造函数 中 , 使用 malloc 函数 , 为 name 指针分配 100 字节内存 ,

// 为 name 成员分配内存
name = (char*)malloc(100);

构造函数 中 , 为 name 指针 , 分配完内存后 , 确保指针分配成功的前提下 , 为 name 指针指向的内存进行赋值 , 这里使用 strcpy_s 函数 , 拷贝字符串到 name 内存中 , 注意 “Tom” 字符串占 4 字节 , 除了 3 个实际字母外 , 还有一个 \0 字符串结尾 , 第二个参数 设置的 值 必须 大于等于 4 , 否则会报错 ;

// 为 name 成员设置字符串值
if(name != NULL)
{
    
    
	strcpy_s(name, 4, "Tom");
}

上述 构造函数 没有设置参数 , 构造函数 是可以设置 若干参数的 , 为构造函数 传入参数 , 对成员变量 进行初始化 , 也是常用操作之一 ;


在 析构函数 中 , 只需要将 name 指针进行销毁即可 , 销毁前确保 name 指针不为空 , 否则会存在导致运行时崩溃的隐患 ;

// 销毁 name 指向的堆内存空间
if (name != NULL)
{
    
    
	free(name);
}

完整代码示例 :

#include "iostream"
using namespace std;

class Student
{
    
    
public:
	Student()
	{
    
    
		// 为 name 成员分配内存
		name = (char*)malloc(100);

		// 为 name 成员设置字符串值
		if(name != NULL)
		{
    
    
			strcpy_s(name, 4, "Tom");
		}
		
		// 为 age 成员设置初始值
		age = 18;

		cout << "调用构造函数" << endl;
	}

	~Student()
	{
    
    
		// 销毁 name 指向的堆内存空间
		if (name != NULL)
		{
    
    
			free(name);
		}
		cout << "调用析构函数" << endl;
	}

public:
	int age;
	char* name;
};

int main()
{
    
    
	// 声明 Student 类型实例对象
	Student s1;

	// 打印 Student 实例对象值
	cout << "name : " << s1.name << " , age : " << s1.age << endl;

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");
    return 0;
}

代码示例 : 执行 main 函数 时 , Student s1 时 自动调用 Student 类构造函数 , main 函数执行完毕退出程序时 , 自动调用 Student 析构函数 , 销毁对象 ;

调用构造函数
name : Tom , age : 18
Press any key to continue . . .

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/han1202012/article/details/132805445