在 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 . . .