本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:
- 基础篇:类与对象(涉及C++的三大特性等);
- STL 篇:学习使用 C++ 提供的 STL 相关库;
- 高阶数据结构与算法篇: 手动实现自己的 STL 库 及 设计实现高阶数据结构,如 B树、B+树、红黑树等。
学习集:
- C++ 入门到入土!!!学习合集
- Linux 从命令到网络再到内核!学习合集
本期内容:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形
目录:
1. 析构函数的概念
2. 析构函数的特性
3. 代码测试
4. 析构函数的使用情形
5. 类类型成员与构造函数
6. 相关文章推荐
【 C++学习合集链接 】
1. 析构函数的概念
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。
注意:先销毁,再调用析构函数!
2. 析构函数的特性
析构函数是特殊的成员函数!
特性:
- 析构函数名是在类名前加上字符 ~。
- 无参数、无返回值类型。
- 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载!
- 对象生命周期结束时,C++编译系统系统自动调用析构函数。
3 代码测试
代码如下:
#include<iostream>
using std::cout;
using std::endl;
class Date {
public:
/* 构造函数 */
Date(int year = 1970, int month = 1, int day = 1) {
_year = year;
_month = month;
_day = day;
cout << "构造函数!" << endl;
}
/* 析构函数 */
~Date() {
cout << "析构函数!" << endl;
}
void Print() {
cout << _year << "-" << _month << "-" << _day << endl;
}
private:
int _year;
int _month;
int _day;
};
int main() {
{ /* d1 若出了 {} 生命周期就结束了! */
Date d1;
}
return 0;
}
4. 析构函数的使用情形
1. 如果没有主动动态申请空间一般不必写析构函数!
2. 若使用了 malloc 、new 等形式申请了空间需要手动写析构函数(手动释放空间)!
代码示例
#include<iostream>
using std::cout;
using std::endl;
typedef int DataType;
/* 定义一个栈的及其构造函数 */
class Stack {
public:
Stack(int capacity = 4) { // 结合参数缺省实现:只要实例化必定是可用的栈(空间为:4)
_capacity = capacity;
_array = (DataType*)malloc(sizeof(DataType) * capacity); // 申请存储空间
if (_array == nullptr) {
perror("malloc fail!\n");
return;
}
_size = 0;
}
/* 析构函数:释放在堆上申请的空间! */
~Stack(){
if(_array){
cout << "析构函数" << endl;
free(_array);
}
}
private:
DataType* _array; // 顺序存储方式
int _capacity; // 记录当前栈的最大存储量
int _size; // 记录当前栈中的元素个数
};
int main() {
{
Stack stk;
}
return 0;
}
5. 相关文章推荐
1. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题