本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:
- 基础篇:类与对象(涉及C++的三大特性等);
- STL 篇:学习使用 C++ 提供的 STL 相关库;
- 高阶数据结构与算法篇: 手动实现自己的 STL 库 及 设计实现高阶数据结构,如 B树、B+树、红黑树等。
学习集:
- C++ 入门到入土!!!学习合集
- Linux 从命令到网络再到内核!学习合集
本期内容:C++ 类的基本成员函数:析构顺序问题 及 类类型(自定义类型)与析构函数
相关内容: C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形
目录:
1. 类类型(自定义类型)与析构函数
2. 析构顺序问题
- - 2.1 关键点说明(重点)
- - 2.2 代码示例说明(结果图分析)
3. 学习析构顺序测试
4. 相关文章推荐
【 C++学习合集链接 】
1. 类类型(自定义类型)与析构函数
编译器会生成的默认析构函数,但对自定类型成员调用它的析构函数。(思路同构造函数中的示例:使用两个栈实现队列示例的析构函数探讨!)
#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; // 记录当前栈中的元素个数
};
class Queue {
private:
Stack _st1;
Stack _st2;
};
int main() {
{
Stack stk;
Queue queue;
}
return 0;
}
2. 析构顺序问题
2.1 关键点说明(重点)
核心思路:析构顺序看对象的存储区域!
总结:栈帧和栈里面的对象都要符合“后进先出”,即:先定义的后析构!
若牵涉到全局与静态相关情形,需注意:全局一定在 main 函数建立栈帧之前初始化!局部量需在函数执行时初始化!
全局变量和静态变量都存储在静态区!局部静态量在函数第一次执行时初始化!
析构顺序问题:全局或静态在程序声明周期结束时析构!局部普通量在局部声明周期结束时析构!无论时何种情形始终满足先定义后析构!
2.2 代码示例说明(结果图分析)
代码示例
#include<iostream>
using std::cout;
using std::endl;
class A {
public:
A(int num = 0) {
_num = num;
cout << "A() -> " << _num << endl;
}
~A() {
cout << "~A() -> " << _num << endl;
}
private:
int _num;
};
A c(1);
int main() {
static A e(2);
A a(3);
A b(4);
static A d(5);
return 0;
}
析构顺序分析如下:
3. 学习析构顺序测试
提问:
- 构造顺序:?
- 析构顺序:?
测试代码如下:
#include<iostream>
using std::cout;
using std::endl;
class A {
public:
A(int num = 0) {
_num = num;
cout << "A() -> " << _num << endl;
}
~A() {
cout << "~A() -> " << _num << endl;
}
private:
int _num;
};
A c(1);
void func() {
static A e(2);
A a(3);
A b(4);
static A d(5);
}
int main() {
func();
func();
return 0;
}
参考结果:
5. 相关文章推荐
1. C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
2. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题
3. C++ 学习 ::【基础篇:14】:C++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形