什么是构造函数和析构函数?
构造函数和析构函数是C++中特殊的成员函数,它们分别负责对象的初始化和清理工作。
-
构造函数:在创建对象时自动调用,用于初始化对象的数据成员
-
析构函数:在对象销毁时自动调用,用于释放对象占用的资源
构造函数详解
构造函数有以下特点:
-
名称与类名完全相同
-
没有返回类型(连void都没有)
-
可以有参数,支持重载(一个类可以有多个构造函数)
示例分析
cpp
Stack(int n = 4) // 带默认参数的构造函数 { int* temp = (int*)malloc(sizeof(int) * n); if (temp == NULL) { perror("temp malloc"); exit(1); } _a = temp; _size = 0; _capacity = n; }
在这个Stack
类的构造函数中:
-
参数
n
有默认值4,表示如果不指定大小,默认创建容量为4的栈 -
使用
malloc
动态分配内存空间 -
检查内存分配是否成功
-
初始化成员变量
_a
、_size
和_capacity
析构函数详解
析构函数有以下特点:
-
名称是在类名前加
~
-
没有返回类型
-
没有参数(因此不能重载,一个类只能有一个析构函数)
示例分析
cpp
~Stack() { free(_a); // 释放动态分配的内存 _a = nullptr; // 将指针置空,避免野指针 _size = _capacity = 0; // 清零计数器 }
在这个Stack
类的析构函数中:
-
使用
free
释放构造函数中分配的内存 -
将指针
_a
设置为nullptr
,防止成为野指针 -
将大小和容量计数器重置为0
默认构造函数和析构函数
如果你不提供构造函数和析构函数,编译器会自动生成:
-
默认构造函数:对基本类型不做初始化,对类类型成员调用其默认构造函数
-
默认析构函数:什么也不做
但对于管理资源的类(如动态内存、文件句柄等),必须自定义析构函数来释放资源。
队列类中的栈成员
在Queue
类中:
cpp
private: Stack stack1; Stack stack2; int size;
-
当创建
Queue
对象时,stack1
和stack2
会自动调用Stack
的构造函数进行初始化 -
当
Queue
对象销毁时,stack1
和stack2
会自动调用Stack
的析构函数进行清理
总结
-
构造函数在对象创建时调用,用于初始化
-
析构函数在对象销毁时调用,用于清理
-
管理资源的类必须自定义析构函数
-
成员对象的构造和析构会自动处理