C++之------------析构函数

C++ 析构函数 C++ 构造函数 阅读详情

析构函数

参考链接

参考链接

什么是析构函数

析构函数为成员函数的一种,名字与类名相同,在前面加‘~’没有参数和返回值在C++中“~”是位取反运算符。
一个类最多只能有一个析构函数。析构函数不返回任何值,没有函数类型,也没有函数参数,因此它不能被重载。

构造函数可能有多个,但析构函数只能有一个,就像人来到人世间,可能出生的环境家庭不同(重载构造函数),但最终都会死亡(析构函数)

什么时候会调用析构函数

(1)如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
(2)static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
(3)如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全局对象的析构函数。
(4)如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
(5)调用复制构造函数后。

构造函数的调用:
(1)全局变量:程序运行前;
(2)函数中静态变量:函数开始前;
(3)函数参数:函数开始前;
(4)函数返回值:函数返回前;
析构函数的调用:
(1)全局变量:程序结束前;
(2)main中变量:main结束前;
(3)函数中静态变量:程序结束前;
(4)函数参数:函数结束前;
(5)函数中变量:函数结束前;
(6)函数返回值:函数返回值被使用后;

继承构造与析构

对于相同作用域和存储类别的对象,调用析构函数的次序正好与调用构造函数的次序相反

这里涉及到构造以及析构的顺序,首先看看构造。**构造函数执行的顺序是,先构造父类,再构造子类,其中父类的构造顺序是从左到右。**然后析构函数执行的顺序是跟构造函数正好相反的,先执行自身的析构函数,然后再依次从右到左执行父类的析构函数。

列表初始化成员变量

	#include <iostream>
	#include <cmath>
	using namespace std;

	class A
	{
	public:
		A(){cout << "Construct A" << endl;}
		~A(){cout << "Destruct A" << endl;}
	};

	class C
	{
	public:
		C(){cout << "Construct C" << endl;}
		~C(){cout << "Destruct C" << endl;}
		
	};

	class B
	{
	public:
		// Notice
		B(): a(A()), c(C()) {cout << "Construct B" << endl;}
		~B(){cout << "Destruct B" << endl;}
		C c;
		A a;
	};

	int main(int argc, char const *argv[])
	{
		B b;
		return 0;
	}

结果

	Construct C
	Construct A
	Construct B
	Destruct B
	Destruct A
	Destruct C

可以看出,列表初始化是先于构造函数的调用的,而且列表初始化是与初始化顺序无关,只与数据成员定义的顺序有关。在上面的例子中C类型的变量定义在A类型的变量前面,因此会先构造C,之后构造A。

结论

在类被构造的时候,先执行虚拟继承的父类的构造函数,然后从左到右执行普通继承的父类的构造函数,然后按照定义的顺序执行数据成员的初始化,最后是自身的构造函数的调用。析构函数与之完全相反,互成镜像。

#include <printf.h>

#include <iostream>
using namespace std;

class A {
 public:
  A() { cout << "A" << endl; }
  ~A() { cout << "~A" << endl; }
};

class B : public A {
 public:
  B(A& a) : a_(a) { cout << "B" << endl; }
  ~B() { cout << "~B" << endl; }

 private:
  A a_;
};

int main() {
  A a;
  B b(a);
  return 0;
}

输出

A
A
B
~B
~A
~A
~A

解释:

​ 构造的时候先构造父类A再开始构造子类B的参数列表A,因为是移动构造所以并没有产生副本最后构造B,所以构造的顺序就是: A A B

​ 析构正好相反

​ 先析构子类,再析构子类的参数列表最后析构父类

​ 所以析构就是 ~B ~A ~A ~A

fins协议握手信号服务器响应,欧姆龙FinsTCP与FinsUDP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析附含报文模拟器等... 前言 – Fins欧姆龙这个协议网上极少有相关的模拟器、Tcp的这一块倒是有但是Udp的基本都是不可用1、 Fins协议结构也很简单 协议分为两种 一种tcp一种udp2、 Tcp比Udp的报文会多一层tcp的head头部3、 Udp回应报文在Wireshark中是解析不到(因为他按照UDP的格式去解那指定是解不到)好长时间没有更新过博客了、也比较懒= = 。一、Read(TCP)发包那么这个就很... 阅读详情

相关推荐

保姆级教程:用CST 2023一步步复现一个1-8GHz Vivaldi天线(含参数优化与结果分析)

本文提供了一份详细的CST 2023教程,指导读者如何从零开始设计并优化1-8GHz Vivaldi天线。内容涵盖工程设置、参数化建模、仿真加速技巧以及性能优化策略,特别适合需要实现宽带天线设计的工程师和研究人员。通过实战案例,帮助用户掌握Vivaldi天线的核心设计要点和CST高级功能应用。

weixin_30800987的博客 619

编程参考 - C++的析构函数的个数只能有一个

C和C++的变量或对象内存生命周期管理区别 C里面的变量,按照生存周期来分,分为静态变量和局部变量。 静态变量是程序在启动时就分配了空间,并且其地址在程序执行中保持不变。静态变量按照访问范围来分,包括全局变量或模块内静态变量。 而局部变量,是函数里在栈上自动分配空间,每次调用函数时,局部变量分配的地址可能不同。 而堆空间的使用,使用单独的库函数来完成。 在C++多了类的使用,类的实例我们通常称之为对象。 关于对象的生存周期管理,和C有所不同。 C语言里,函数内部的局部变量,在函...

guoqx的专栏 1417

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出

QCC5125/QCC5144----LDAC 44.1K 48K 96K 192K 输出。而且还不需要license限制。

Alex_886的博客 1975

C++ 析构函数(函数前面有波浪号~)

什么是析构函数 析构函数定义类型和构造函数的定义类型差不多,也是名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。 构造函数和析构函数对比如下 #include <iostream> #include <string> using namespace std; class Fun_a { public: char *message; Fun.

小牧在一直在学习,在前进的道路上大家一起学习,进步。 7347

串行通信原理及实验仿真

1. 处理器与外部设备通信的两种方式: 并行通信和串行通信 并行通信是指数据的各个位用多条数据线同时进行传输 优点:传输速度快 缺点:占用引脚资源多 串行通信是将数据分成一位一位的形式在一条传输线上逐个传输 优点:通信线路简单,占用引脚资源少 缺点:传输速度慢 2. 串行通信的通信方式: 同步通信和异步通信 同步通信:带有时钟同步信号的数据传输;发送方和接收方在同一时钟的控制下,同步传输数据。 异步通信:不同时钟同步信号的数据传输。发送方和接收方使用各自的时钟控制数据的发送和接收过程。 3. 串行通

gemengxia的博客 4322

Codex 实战 Skills:用 Skill 自动识别并提取 PDF/图片表格数据,效率提升 10 倍

本文介绍如何构建一个多模态文件解析 Skill,用于自动识别和提取 PDF/图片中的表格数据,提升 AI 智能体处理非结构化文档的效率。文章分析了传统方法的局限性,提出分层解析架构(预处理、检测、提取推理、后处理),推荐技术栈包括 pdfplumber、OpenCV 和多模态大模型。详细说明了 Skill 的元数据定义、数据模型设计(使用 Pydantic)和核心实现流程,通过混合策略实现从复杂文档到结构化 JSON/Markdown 的转换,使 AI 代理具备"阅读"多模态文档的能力。

yueyeguzhuo的专栏 308

C++入门-----析构函数

析构函数

weixin_52669146的博客 7525

把审批体验做成一体化:SAP Business Workflow 里的 Secondary Method、Before Method 与 After Method

摘要:SAP Business Workflow 中,Task 的 Secondary、Before 和 After 三类方法对提升审批体验和可追溯性至关重要。Secondary Method 可自动展示辅助信息(如审批时弹出排班报表),但需注意其独立会话特性;Before Method 适合预处理和审计留痕;After Method 确保收尾动作可靠执行。三类方法按特定顺序调用,且错误不影响主流程。合理使用这些方法能减少事务码切换,增强审计能力,优化用户体验。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 191

C++——析构函数

当 obj 的生命周期结束时(即离开了它的作用域), MyClass 的析构函数被自动调用,负责清理资源,防止内存泄露。析构函数是C++中的一个特殊的成员函数,它在对象生命周期结束时被自动调用,用于执行对象销毁前的清理工作。标注粗体部分,是能快速上手的内容,方便后续QT的学习,而没有粗体的部分,会在QT结束后,如果安排C++深入讲解的课程的话,会安排到。:当对象的生命周期结束时(例如,一个局部对象的作用域结束,或者使用 delete 删除。一个动态分配的对象),析构函数会被自动调用。

qq_47944751的博客 2028

Yolo8行人车辆目标检测实战分享 完整项目代码可直接运行

Yolo8行人车辆目标检测实战分享 完整项目代码可直接运行

1294

SST专题(2-4)MMC-SST 输入级的环流分析

本文分析了模块化多电平换流器(iMMC-SST)的输入级等效电路、子模块电容电压波动特性及环流抑制机理。研究表明:1)子模块电容电压波动包含基频和二倍频分量,与传统换流器相比波动幅值更大;2)环流主要由子模块电容电压波动在桥臂电感上激发的偶次谐波电流构成,呈频率越高幅值越小的特性;3)可通过增大桥臂电感或采用调制策略叠加抑制电压分量来有效控制环流。研究结果为MMC系统设计提供了理论依据。

嵌入式老牛的博客 585

【C++】析构函数

在开辟空间时,需要构造函数来开辟空间,对应,作用域退出时也需要一个函数做“收尾”的工作,与构造函数对应——析构函数析构函数和构造函数作用相反,用于释放对象的内存空间如果程序员未写构造函数,那么系统也会提供一个默认的构造函数,同样,如果程序员未写析构函数,那么系统也会提供一个默认的析构函数,在当前对象退出时,自动调用,进行释放空间。

qq_53830608的博客 4267

PCL 将对象模板与点云对齐【2025最新版】

PCL模版匹配算法的使用案例,博客长期更新,本文最近更新时间为:2025年1月18日。

点云侠的博客 5379

C++中的虚析构函数

Cpp中的虚析构函数 1.虚析构函数的作用:为了避免内存泄漏,而且是当子类中会有指针成员变量时才会使用到。即虚析构函数使得在删除指向子类对象的基类指针时,可以调用子类的析构函数来实现释放子类中堆内存的目的,从而防止内存泄漏。 2.C++中开发中,基类中的析构函数一般都是虚函数,如下面的例子: #include <iostream> using namespace st...

CurryCoder的个人博客 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++ 析构函数

C++ 析构函数我使用的继承开发环境: Visual Studio 2010设计一个类时,如何写析构函数? 析构函数如果我们不写的话,C++ 会帮我们自动的合成一个,就是说:C++ 会自动的帮我们写一个析构函数。很多时候,自动生成的析构函数可以很好的工作,但是一些重要的事迹,就必须我们自己去写析构函数。 析构函数和构造函数是一对。构造函数用于创建对象,而析构函数是用来撤销对象。简单的说:一个

AoboSir.com 8万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++析构函数

类的6个默认成员函数:如果一个类中什么成员都没有,简称为空类。空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

qq_74013365的博客 2358

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

cpp——类——析构函数

概述 析构函数特点: 函数名为“~类名”,用来标记和识别析构函数 没有返回值,析构函数是对自身的销毁行为,返回值无意义,因为没有返回值的接收者 形参列表为空,所以析构函数没有重载,唯一的 构造函数VS析构函数: 构造函数是对自身的初始化,生成(定义)对象时自动调用 析构函数是对自身的销毁,销毁对象时自动调用 辅助类 class CAnimal { public: CAnimal() : mGroup(0) { cout << "CAnimal()" << endl;

mardax的专栏 3000

C++中虚析构函数的作用

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:        有下面的两个类:class ClxBase{public:    ClxBase() {};    virtual ~ClxBase() {};    virtual void DoSomething() { cout  "Do something 

寒星轩 19万+

【C++ | 析构函数】类的析构函数详解

👉本文主要介绍类的析构函数的声明、定义、使用,以及析构函数在什么时候被调用。其实析构函数很简单,当你需要在对象被销毁时释放资源或内存时,就自己定义一个析构函数。

wkd_007的博客 4407

入门cpp之构造函数和析构函数

int _month;int _day;对于上面这个类,我们每次创建一个Date类型的变量,都需要调用Init函数去初始化,难免会有忘记初始的时候。cpp中有构造函数可以在变量创建时,自动将信息设置进去,这就是构造函数。构造函数是一个特殊的成员函数,名字与类名相同创建类类型对象时由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。

zyzyzy_mhmhmh的博客 832

Cherno的Cpp教程笔记010:C++ 构造与析构函数

无构造函数(输出为随机值,即为其分配的地址的值)加上构造函数(初始化为0)

ResumeProject的博客 258

析构函数 cpp

3. 自动调用:当对象的生命周期结束时(例如,一个局部对象的作用域结束,或者使用 delete 删除 一个动态分配的对象),析构函数会被自动调用。析构函数特别重要,尤其是在涉及动态分配的资源(如内存、文件句柄、网络连接等)的情 况下。1. 名称:析构函数的名称由波浪号( ~ )后跟类名构成,如 ~MyClass()。2. 无返回值和参数:析构函数不接受任何参数,也不返回任何值。5. 继承和多态:如果一个类是多态基类,其析构函数应该是虚的。和构造函数一样,都是特殊的成员函数,析构函数是C++中的一。

qq_65305227的博客 650

C/Cpp / C++ 构造函数和析构函数可以是虚函数吗

答案 构造函数不可以是虚函数,而析构函数可以且常常是虚函数。 原因 1、构造函数不可以是虚函数 当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构。 虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中,当存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针)。在实现多态的过程中,父类和派生类都有vptr指针。 vptr的初始化:当对象在创建时,由编译器对 vptr 指针进行初始化。在定义子类对象时,vptr 先指向

布袋和尚 1260

c++析构函数

分析: 在main函数中创建了t0,t1,t2,t3几个对象,这里先说一下C++创建对象的三种不同方式: 1、Test p1(1); //栈中分配内存 2、Test p2 = Test(2);        //栈中分配内存,跟方法1相同,是方法1的完整模式 3、Test *p3 = new Test(3);     //堆中分配内存 方法1、2中都是在栈中分配内存,在栈中内存由系统自动的去分配和释放,而使用new创建的指针对象是在堆中分

scarificed的博客 5387

【C++ 析构函数】C++ 私有析构函数的作用

C++ 私有析构函数的作用

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2088

C++中基类的析构函数为什么要用virtual虚析构函数

C++中基类的析构函数为什么要用virtual虚析构函数, 弄清楚为什么。

IIcyZhao's Road 1万+
上一篇: 数据结构之----------单调队列
下一篇: C++-----------------数据结构优先队列
黑猫爱小鹿
博客等级 码龄8年 1万+粉丝 205原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值