C++构造函数和析构函数的调用顺序

        一般情况下,调用析构函数的次序正好与调用构造函数的次序相反,也就是最先被调用的构造函数,其对应的析构函数最后被调用,而最后被调用的构造函数,其对应的析构函数最先被调用。

        当然对象的构造函数和析构函数调用时机和它的生命周期是密不可分的。 下面归纳一下什么时候调用构造函数和析构函数。
        (1)全局对象(生命周期:程序运行时创建,程序结束时销毁)的构造函数在所有函数(包括main函数)执行之前调用。但如果一个程序中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序终止),调用其析构函数。
        (2)局部对象(在函数内定义的对象,其生命周期是进入该函数创建,函数退出结束)在进入该函数建立对象时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束时调用析构函数。
        (3)如果在函数中定义了静态(static)局部对象(生命周期是第一次进入该函数创建,程序退出时销毁),则只在程序第一次调用此函数建立对象时调用一次构造函数,在调用结束时对象并不被释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用析构函数。
        (4)动态创建的对象,是调用new关键字创建函数时调用构造函数,调用delete函数销毁对象时调用析构函数。

1.全局变量

例如:构造函数与析构函数执行顺序。


//1.全局对象
class Time  //时间类
{
private:int hour;int minute;int second;
public:Time(int h, int m, int s); //构造函数~Time();//析构函数
};
Time::Time(int h, int m, int s) //定义构造函数
{hour = h;minute = m;second = s;cout << "时间 构造函数:" << hour << ":" << minute << ":" << second << endl;
}
Time::~Time()//定义析构函数
{cout << "时间 析构函数: " << hour << ":" << minute << ":" << second << endl;
}Time g_a = {8,0,0};
Time g_b = {9,0,0};
static Time g_c = {10,10,10};
static Time g_d = {11,11,11};int main()
{cout << "进入main()" << endl;cout << "退出main()" << endl;return 0;
}

2.局部变量

对局部对象和局部静态对象的测试如下:

//2.局部对象和局部静态对象
class Time  //时间类
{
private:int hour;int minute;int second;
public:Time(int h, int m, int s); //构造函数~Time();//析构函数
};
Time::Time(int h, int m, int s) //定义构造函数
{hour = h;minute = m;second = s;cout << "时间 构造函数:" << hour << ":" << minute << ":" << second << endl;
}
Time::~Time()//定义析构函数
{cout << "时间 析构函数: " << hour << ":" << minute << ":" << second << endl;
}void Fun()
{cout << "进入Fun()" << endl;Time a = { 12,0,0 };Time b = { 13,0,0 };static Time c = { 14,14,14 };static Time d = { 15,15,15 };cout << "退出Fun()" << endl;
}int main()
{cout << "进入main()" << endl;Fun();cout << "退出main()" << endl;return 0;
}

执行结果如下:

1.png

3.动态内存

动态创建对象测试如下:

//动态对象
class Time  //时间类
{
private:int hour;int minute;int second;
public:Time(int h, int m, int s); //构造函数~Time();//析构函数
};
Time::Time(int h, int m, int s) //定义构造函数
{hour = h;minute = m;second = s;cout << "时间 构造函数:" << hour << ":" << minute << ":" << second << endl;
}
Time::~Time()//定义析构函数
{cout << "时间 析构函数: " << hour << ":" << minute << ":" << second << endl;
}int main()
{cout << "进入main()" << endl;Time* pt1 = new Time{16,0,0};Time* pt2 = new Time{17,0,0};//没有delete,内存泄漏delete pt1;cout << "退出main()" << endl;return 0;
}

程序执行结果如下:

1.png

4.其它情况

全局变量和局部变量夹杂情况如下,程序运行结果是什么呢?

class Time  //时间类
{
private:int hour;int minute;int second;
public:Time(int h, int m, int s); //构造函数~Time();//析构函数
};
Time::Time(int h, int m, int s) //定义构造函数
{hour = h;minute = m;second = s;cout << "时间 构造函数:" << hour << ":" << minute << ":" << second << endl;
}
Time::~Time()//定义析构函数
{cout << "时间 析构函数: " << hour << ":" << minute << ":" << second << endl;
}
class Date  //日期类
{
private:int year;int month;int day;
public:Date(int y, int m, int d); //声明构造函数~Date(); //声明析构函数
}yesteday(2023, 4, 21); //定义全局对象Date::Date(int y, int m, int d) //定义构造函数
{year = y;month = m;day = d;//在类Date定义的构造函数中定义类Time的对象(局部)Time time{ 11, 11, d };cout << "日期 构造函数: " << year << ":" << month << ":" << day << endl;
}
Date::~Date()
{cout << "日期 析构函数: " << year << ":" << month << ":" << day << endl;
}int main()
{cout << "进入 main()" << endl;Date today(2023, 4, 22);cout << "退出 main()" << endl;return 0;
}

1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣100284. 有效单词(C++)

【题解】 (实际在力扣中运行的代码只需要把下方的check函数放到力扣作答区给的模板中就可以) #include <bits/stdc.h> #include <iostream> #include <vector> #include <string> #include <cctype> #include <cstring> #include <st…

融知财经:期货交易的规则和操作方法

期货交易是指在未来的某一特定时期&#xff0c;买卖双方通过签订合约的方式&#xff0c;约定以某种价格买卖一定数量的某种商品或资产的行为。期货交易的规则和操作方法如下&#xff1a; 期货交易的规则和操作方法 1、双向交易&#xff1a; 期货市场允许投资者进行多头&#xf…

Python ArcPy批量将大量栅格文件的投影坐标系转为地理坐标系

本文介绍基于Python语言中的ArcPy模块&#xff0c;批量将多个遥感影像由投影坐标系转为地理坐标系的方法。 在之前的文章中&#xff0c;我们介绍过将单独1景遥感影像的投影坐标系转为地理坐标系的方法&#xff0c;大家可以参考文章投影坐标系转为地理坐标系&#xff1a;GDAL命令…

笔记86:关于【#ifndef + #define + #endif】的用法

当你在编写一个头文件&#xff08;例如 pid_controller.h&#xff09;时&#xff0c;你可能会在多个源文件中包含它&#xff0c;以便在这些源文件中使用该头文件定义的函数、类或其他声明。如果你在多个源文件中都包含了同一个头文件&#xff0c;那么当你将整个工程统一编译&am…

第六节课《Lagent AgentLego 智能体应用搭建》

PDF链接&#xff1a;https://pan.baidu.com/s/1JFtvBWgEGFWJq8pHafvIUg?pwd6666 提取码&#xff1a;6666 Lagent & AgentLego 智能体应用搭建_哔哩哔哩_bilibili https://github.com/InternLM/Tutorial/blob/camp2/agent/README.md InternStudio 一、为什么需要agent…

基于JSP的酒店客房管理系统(三)

目录 第四章 系统各模块的实现 4.1客房管理系统首页的实现 4.1.1 客房管理系统首页概述 4.2客房管理系统前台的实现 4.2.1 客房管理系统前台概述 4.2.2 客房管理系统前台实现过程 4.2.3 预定客房信息及客房信息的查询 4.3客房管理系统后台的实现 4.3.1 客房管理系统后…

微搭低代码入门05文件的上传和下载

目录 1 创建数据源2 创建应用3 创建页面4 设置导航功能5 文件上传6 文件下载总结 小程序中&#xff0c;我们通常会有文件的上传和下载的需&#xff0c;在微搭中&#xff0c;文件是存放在云存储中&#xff0c;每一个文件都会有一个唯一的fileid&#xff0c;我们本篇就介绍如何通…

Unity类银河恶魔城学习记录 17-1,2 p166 Aliments fx p167 Blackhole additional vfx

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic; …

Vue3(管理系统)-封装axios(utils)

一、在utils下编写request.js实例 1.添加基地址&#xff0c;设置超时时间 import axios from axios const baseURL http://big-event-vue-api-t.itheima.net const instance axios.create({// TODO 1. 基础地址&#xff0c;超时时间baseURL,timeout: 3000 }) 2.添加请求拦截…

[C++][数据结构]红黑树的介绍和模拟实现

前言 之前我们简单学习了一下搜索树和平衡搜索树&#xff0c;今天我们来学习一下红黑树 简介 概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着…

面试官:关于HTTPS/HTTP2/HTTP3你懂多少?

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ HTTPS是什么 HTTP为什么不安全&#xff1f; https被认为是通信安全的http&#xff0c;除了http多了s和默认端口改成了443之外&#xff0c;其他都是沿用的http&#xff08;除了明文和不安全&#xff09;&#xff0…

基于FPGA的数字信号处理(9)--定点数据的两种溢出处理模式:饱和(Saturate)和绕回(Wrap)

1、前言 在逻辑设计中&#xff0c;为了保证运算结果的正确性&#xff0c;常常需要对结果的位宽进行扩展。比如2个3bits的无符号数相加&#xff0c;只有将结果设定为4bits&#xff0c;才能保证结果一定是正确的。不然&#xff0c;某些情况如77 14(1110)&#xff0c;如果结果只…

SOLIDWORKS Electrical由3D布局生成2D机柜布局图

想要转换3D装配体到Electrical中需要在3D打开Electrical插件&#xff0c;并使用工程管理器打开需转换工程图的装配体 1、创建2D图纸 打开后在上方工具选项卡中选择-SOLIDWORKS Electrical选项卡-的创建2D图纸 2、选择图纸视角 使用创建2D图纸后就会进入工程图界面&#xff0c;在…

裁员为什么先裁技术人员?

最近这个问题比较火&#xff0c;我分享一个印象深刻的答案&#xff1a;楼盖完了&#xff0c;还需要搬砖的吗&#xff1f; 这个答案让我对互联网/程序员这个行业/职业有了新的认识。 房地产是在现实世界里盖房子&#xff0c;互联网是在虚拟世界里盖房子&#xff0c;只不过互联网…

第78天:WAF攻防-菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

目录 案例一&#xff1a; 菜刀-流量&绕过&特征&检测 菜刀的流量特征 案例二&#xff1a;冰蝎-流量&绕过&特征&检测 冰蝎使用教程 冰蝎的流量特征 案例三&#xff1a; 哥斯拉-流量&绕过&特征&检测 哥斯拉使用教程 哥斯拉的流量特征…

调用第三方接口——支付宝付款

沙箱环境是支付宝开放平台为开发者提供的用于接口开发及主要功能联调的模拟环境。 参考 登录 - 支付宝 在沙箱环境下&#xff0c;已经分配好了用于模拟测试的应用信息、商家信息、买家信息等 小程序文档 - 支付宝文档中心 内网穿透&#xff08;支付宝付款需要在公网进行检查…

PyTorch深度学习框架:从入门到实战

前言 学习 PyTorch 深度学习框架之前先学会深度学习和卷积神经网络 CNN &#xff0c;这样学习起来会更香嗷。 Windows系统下PyTorch的环境配置 Anaconda是什么&#xff1a; Anaconda是一个开源的Python发行版本&#xff0c;专注于数据分析领域。它包含了conda、Python等190多…

为什么感觉没有效果

以前在辅导小儿作业的时候&#xff0c;我会在常用的搜索引擎里去寻找答案&#xff0c;一般情况下都能解决问题。 但是最近一段时间&#xff0c;我发现&#xff0c;搜索引擎搜出来的结果还没有利用短视频搜出来的答案更全面&#xff0c;短视频软件不仅可以显示AI整理出来的答案…

CTF(Web)中关于执行读取文件命令的相关知识与绕过技巧

在我遇到的题目中&#xff0c;想要读取文件必然是要执行cat /flag这个命令&#xff0c;但是题目当然不会这么轻松。让你直接cat出来&#xff0c;必然会有各种各样的滤过条件&#xff0c;你要做的就是尝试各种方法在cat /flag的基础上进行各种操作构建出最终的payload。 下面我…

【LeetCode 121】买卖股票的最佳时机

思路 思路&#xff1a; 所谓代码的复杂性来源于业务的复杂性&#xff0c;如果能够想清楚业务实现逻辑&#xff0c;就能够轻松写出代码&#xff1b; 假设当前是第i天&#xff0c;如何在第i天赚到最多的钱&#xff1f;需要在第i天之前以最低价买入股票&#xff1b; 所以需要求…