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

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

  1. 基础篇类与对象(涉及C++的三大特性等);
  2. STL 篇学习使用 C++ 提供的 STL 相关库
  3. 高阶数据结构与算法篇手动实现自己的 STL 库设计实现高阶数据结构,如 B树、B+树、红黑树等。

学习集:


本期内容: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++ 类的基本成员函数:析构函数的作用 及 自定义析构函数情形

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NPC的白话文谈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值