C++ 学习 ::【基础篇:15】:C++ 类的基本成员函数:析构顺序问题(全局/静态/局部量) 及 类类型(自定义类型)与析构函数

news/2025/1/16 1:45:44/

本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:

  1. 基础篇类与对象(涉及C++的三大特性等);
  2. STL 篇学习使用 C++ 提供的 STL 相关库
  3. 高阶数据结构与算法篇手动实现自己的 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++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形


http://www.ppmy.cn/news/183512.html

相关文章

深入理解设计原则之单一职责原则(SRP)

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 SRP&#xff1a;单一职责原则 系列文章目录1、单一职责原则的定义和解读2、单一职责原则案例解读2.1、违背单一职责原则反面案例2.2、违背单一职责原则反面案例 - 解决方案 3…

FB模拟使用gosub

之前在汇编测试里使用汇编实现了函数内的子函数调用&#xff0c;但不完美&#xff0c;只能在gas编译器里使用&#xff0c;所以使用goto语句结合宏定义&#xff0c;实现函数内部的子函数调用。有3个关键语句&#xff1a; 1、调用子函数语句&#xff1a; GotoSub(子函数名) 2…

apple pencil一代的平替有哪些品牌?平价电容笔推荐

要知道&#xff0c;真正的苹果原装电容笔&#xff0c;价格可不低&#xff0c;仅仅一支就是近千块。实际上&#xff0c;平替电容笔对没有太多预算的用户是个不错的选择。一款苹果的电容笔的售价&#xff0c;相当于平替电容笔的四倍&#xff0c;不过平替电容笔的书写体验&#xf…

java关于ArrayList输出的心得

for(R r:rankList)//R是元素类型&#xff0c;r是元素/一个对象&#xff0c;rankList指循环中的所有对象 //元素的名字可以任意取{//System.out.println(r); // errSystem.out.println(r.getName()" "r.getAve());} 直接填写对象的方法只能像如下 public static v…

索尼发布可换镜头Vlog相机ZV-E10,售价700美元

索尼电子公司(Sony Electronics Inc.)宣布推出首款Alpha系列可换镜头Vlog相机ZV-E10。这款新相机专为视频创作者设计&#xff0c;结合了索尼先进的成像技术和为用户优化的定制功能。 ZV-E10的核心是2420万像素APS-C Exmor™传感器和BIONZ X图像处理器&#xff0c;可生成高质量图…

Momenta“飞轮式L4”接受夜间长尾场景「像素级」挑战,表现堪比老司机

7月20日&#xff0c;Momenta以一段视频的形式披露其“飞轮式L4”技术在夜间长尾场景中的精彩表现。 继今年5月Momenta应用“飞轮式L4”技术的享道Robotaxi&#xff0c;应对白天多个城市复杂场景的视频披露之来&#xff0c;“飞轮式L4”技术的夜间长尾场景应对能力也在本次视频…

3D摄影机选择指南,你知道自己需要什么样的摄影机吗?

随着 3D 成像技术日趋成熟&#xff0c;3D 摄影机已经出现在日常服务、金融支付、物流分拣、加工制造等越来越多的应用场景中。但仍有许多使用者&#xff0c;由于不甚了解不同类型 3D 摄影机之间的差异&#xff0c;在进行设备选择时存在诸多困惑。本文将系统介绍各类 3D 摄影机的…

相机镜头选择:相机焦距、视场角和景深(可视距离)之间的关系

本文相关资料来自于百度及https://blog.csdn.net/gurun88/article/details/52954014 一、焦距与视场角的关系 讲到视场角&#xff0c;大概可分为长焦镜头、标准镜头、广角镜头、鱼眼镜头等。焦距越小&#xff0c;视场角越大&#xff0c;拍摄距离越近&#xff0c;景深越大。 焦…