C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第4节:析构函数

Windows 24H2下eNSP AR_40启动失败的终极修复指南 本文针对Windows 11 24H2更新后eNSP AR_40路由器启动失败的问题,提供了终极修复方案。核心在于解决系统强制虚拟化安全(VBS/Hyper-V)与老版模拟软件的兼容性冲突。指南详细介绍了安装关键系统更新KB5053656、精细调整Windows虚拟化功能以及后续排错步骤,帮助用户在24H2系统上稳定运行eNSP进行网络实验。 阅读详情

 

12.4 析构函数

1.         在类的定义中,使用一种特殊的声明语法:函数说明符(可选) +  ~  + 析构函数的类名 + 空括号 来声明析构函数。在这个声明中, ~ 类名 可以被可选的圆括号括起来,圆括号被忽略。命名一个类的 typedef-name 也是个类名,但是这个 typedef-name 却不能用作析构函数的标识符。

2.         析构函数用来销毁该类的对象。它没有参数,不能指定返回类型(甚至 void 也不允许)。不要试图获取析构函数的地址。析构函数不能是静态的。它可以被 const 、 volatile 或 const volatile 的对象调用。析构函数不能声明为 const 、 volatile 或 const volatile 类型,因为 const 和 volatile 的语义对于一个正在销毁的对象来说是不适用的,这些语义在对象一旦开始销毁时就失效了。

3.         如果用户没有定义析构函数,编译器会隐式声明一个。隐式声明的析构函数是 inline public 属性的成员。满足以下条件,析构函数就是 trivial 的:

a)         所有直接基类具有 trivial 的析构函数

b)        对于所有非静态数据成员来说,如果它是类(或对象数组),那每个这样的数据成员都得有 trivial 的析构函数

4.         否则,析构函数就是非 trivial 的。

5.         当销毁对象时,隐式声明的析构函数会被隐式地定义。如果隐式定义的析构函数有如下情况之一,它就是非法的:

a)         静态数据成员是类(或对象数组),但它们的析构函数不可访问

b)        基类的析构函数不可访问

在隐式定义的析构函数被隐式定义之前,该类的所有基类的析构函数、该类的所有非静态数据成员的析构函数 都必须已经定义好。【注:隐式声明的析构函数还会有一个异常说明。】

6.         类 X 在执行了析构函数体并销毁了析构函数体内定义的自动对象之后,它调用直接成员、直接基类、的析构函数;如果 X 是最继承类,它还会调用虚基类的析构函数。所有析构函数都被当做限定了的名字来调用 ,也就是说,忽略任何外层派生类可能的虚析构函数覆盖。基类与数据成员以与其构造完成时相反的顺序被销毁。析构函数中的 return 语句不会直接返回到调用者;在将控制权交给调用者之前,成员和基类的析构会被调用。数值元素的析构顺序与它们的构造完成顺序相反。

7.         析构函数可以声明为虚函数或纯虚函数,如果在程序中该类被实例化,或该类的继承类被实例化,该析构函数应该被定义。如果基类的析构是虚函数,那该类的析构函数也必然为虚函数(无论是否用户自己定义)。

8.       【在析构过程中使用析构函数,在一些语法结构中有特殊的语义。】 【按:失去虚函数的语义】

9.         union 的成员如果是个类(或对象数组),那么这个类的析构函数必须是 trivial 的

10.     已创建的静态存储类型的对象,其析构函数在程序结束的时候调用;已创建的自动存储类型的对象,其析构函数在定义该对象的块结束的时候调用;已创建的临时对象,其析构函数在该临时对象生命周期结束的时候调用;用 new 表达式创建的对象,其析构函数在 delete 表达式中调用,某些情况下也可能在异常处理中调用。如果类中的对象成员或对象数组成员的析构函数在该类的声明点处不可访问,程序就是非法的。析构函数还可以被显式地调用。

11.     在定义虚析构函数时(包括隐式定义),会在类中查找非定点的操作符 delete ,如果找到了,该操作符 delete 应该是可访问、且无二义性的。【注:这条规则确保了对应对象动态类型的操作符 delete 是可以执行 delete 表达式的。】

12.     在显式调用析构函数时,析构函数可以是 ~ + typedef-name 的形式。 析构函数的调用遵循普通成员函数的调用规则,也就是说,如果对象的类型不是析构函数所在的类、也不是该类的派生类,程序的行为是未定义的(除非对 NULL 进行 delete 操作,都是无效果)。【例:

struct B {

virtual ~B() { }

};

struct D : B {

~D() { }

};

D D_object;

typedef B B_alias;

B* B_ptr = &D_object;

void f() {

D_object.B::~B(); // calls B ’s destructor

B_ptr->~B(); // calls D ’s destructor

B_ptr->~B_alias(); // calls D ’s destructor

B_ptr->B_alias::~B(); // calls B ’s destructor

B_ptr->B_alias::~B_alias(); // error, no B_alias in class B

}

】

【注:显式析构函数的调用必须使用类域解析符,特殊的地方是,成员函数中的单目表达式 ~X() 不是显式析构调用。】【 按:加类域解析符就是为了避免与这种单目表达式(创建一个X 的临时对象,将其转换为bool 类型,然后取逻辑非)的二义性。】

13.     【注:显式调用析构函数的情况比较罕见。一个用途是对特定地址的对象(用定点 new 表达式创建的)进行析构。这种用法在处理特定的硬件资源和编写内存管理程序的时候有用。例如:

void* operator new(size_t, void* p) { return p; }

struct X {

// ...

X(int);

~X();

};

void f(X* p);

void g() // 比较罕见的用法

{

char* buf = new char[sizeof(X)];

X* p = new(buf) X(222); // 使用 buf[] 并初始化

f(p);

p->X::~X(); // 清除

}

】

14.     一旦对一个对象调用了析构函数,该对象就不存在了 ;对生命周期已经结束的对象调用析构函数,该行为是未定义的。【例:如果一个自动对象的析构函数被显式地调用了,在块结束的时候会隐式地再调用一次析构函数,该行为是未定义的。】

15.     【注:显式析构函数的调用语法可以用在标量类型名字上,这么做可以让写代码更方便:不必知道一个类型是否有析构函数。例如:

typedef int I;

I* p;

// ...

p->I::~I();

       】

ANSYS二次开发:Python和ANSYS进行交互操作(PyAnsys库,DPF) 🎈ANSYS二次开发:APDL开发入门准备🎈- 🎈ANSYS二次开发:后处理使用APDL命令流解析结果文件🎈 🎈ANSYS二次开发:Python解析ANSYS结果文件(PyAnsys库)🎈 🎈ANSYS二次开发:Python操作ANSYS(PyAnsys库,PyDPF)🎈 文章目录1、简介2、安装2.1 ansys-mapdl-core2.2 pyaedt2.3 ansys-dpf-core2.4 ansys-dpf-post2.5 ansys-mapdl-reader2.6 G... 阅读详情

相关推荐

Win11任务栏图标消失?快速恢复指南

任务栏图标消失是Windows 11操作系统中常见的问题之一,但通过上述方法,用户通常可以轻松解决这一问题。无论是重启Windows资源管理器、使用命令提示符修复、检查系统更新和设置,还是考虑重装系统,都可以帮助用户恢复任务栏图标的正常显示。希望本文的介绍能对用户有所帮助,让Windows 11的使用更加顺畅和愉快。

mmoo_python的博客 5411

C++类外写构造函数实现编译报错:definition of implicitly-decleared ‘函数名’

编译报错:definition of implicitly-decleared ‘GoodGay::GoodGay()’

PrincePi的博客 5374

告别TwinCAT:手把手教你用IgH EtherCAT Master在LinuxCNC上搭建实时运动控制平台

本文详细介绍了如何利用IgH EtherCAT Master和LinuxCNC搭建开源实时运动控制平台,替代商业软件TwinCAT。通过分步指南,包括实时Linux环境配置、EtherCAT主站安装、LinuxCNC集成及多轴同步控制实现,帮助开发者构建高性能、低成本的工业自动化解决方案。

weixin_42641741的博客 401

C++面向对象(高级)

1.代理构造(委托) 一个构造函数可以调用另外的构造函数 class A{ public: A(): A(0) {} A(int i):A(i,0){} A(int i,int j){ num1 = i; num2 = j; average = (num1 + num2) / 2; } } 注:避免递归调用 例: class A{ public: A():A(0){} ...

Hhangfs的博客 471

教程 | VeriStand硬件在环仿真测试第一章

这篇是系列文章的第一章,满满的都是干货,感兴趣的话欢迎一起交流探讨。

HUASUITECH的博客 1万+

KUKA .RSI 软件包

KUKA RSI软件包通过XML文件使得机器人与外部设备(传感器通讯)通讯成为了可能,但仍存在诸多限制,该模块最多允许9台设备进行连接,有限的IO口,匮乏的功能,并且需要投入大量精力琢磨相关说明文档。为此开发人员针对KUKA实时通讯,做了一些开源的接口使得上位机与机械臂的通讯更为简单。

huhu7777的博客 3293

visual studio code 常见报错

visual studio code 常见报错,报错如下: error: definition of implicitly-declared 'constexpr myString::myString(const myString&)' myString::myString(const myString & st){ 原因是在类里边没有声明myString(const myString&),在public中进行声明即可。 ...

weixin_54663210的博客 2639

processing与arduino互动编程

Arduino开发板对AVR单片机二次编译封装,无需考虑单片机编程寄存器、地址指针等复杂细节processing借助arduino读取各种传感器的数值,控制各种机电装置。

weixin_45679408的博客 824

构造函数语意学---Default Constructor的构造操作

此篇博客的主要内容 :默认构造函数什么时候被编译器创造出来,并且做了哪些事。 1.首先默认构造函数在需要的时候会被创建出来,这里的需要有两种解释1.编译器的需要,2.程序的需要,当然编译器如果需要的话那么编译器就会自己合成默认构造函数,但是如果程序需要的话那就是程序员的事情了,编译器才不会去帮程序员合成默认构造函数呢。下面举个例子来说明被程序需要的默认构造函数 class Foo { pub

IT_iverson的博客 592

字节跳动高频111道核心前端面试题解析,web开发增强

但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。自定义指令(v-check、v-focus)的方法有哪些?v-model是什么?

2401_84094620的博客 1200

ARMv8/ARMv9的TLB深度学习

千万不要人云亦云。一个TLB entry里有很多很多东西的,有100多个比特位呢,并不是仅仅只有VA/PA/nG/VMID/ASID等。.👉👉👉 个人博客笔记导读目录(全部) 👈👈👈。

baron-周贺贺-代码改变世界ctw 1569

QT日常报错解决方案

日常报错 3.1 undefined reference to vtable vtable 表示的是虚表, 这个错误出现时,请检查你的父类所有虚函数是否实现, 或者子类是否把父类的虚函数都处理完. 注意:析构函数也算. 有时候一开始没有添加Q_OBJECT,但是要用信号与槽,添加后编译也可能回出现这个错误,这个是因为Makefile里没有更新,删掉配置文件重新编译或者重新运行qmake即可 3.2 definition of implicitly-declared virtual… 虚析构函数没有显式声明。

YH_24H的博客 2199

《Scratch图形化等级考试(1~4级)历届真题解析》专栏总目录

❤️ 专栏名称:《🌸 专栏介绍:中国电子学会《全国青少年软件编程等级考试》Scratch图形化等级考试(1~4级)历届真题解析。🚀 订阅专栏:原价 99.9,🔥 火爆订阅中 🔥,限时 19.9。订阅后可阅读专栏内所有文章,本专栏持续更新中,欢迎订阅!

人生就是一个不断学习的过程 1万+

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第1节:构造函数

12. 特殊成员函数【按:以下简称特殊函数或这些函数;如没有特别说明,对象是指类实例化的对象, 最外层的对象是指最继承子对象】特殊成员函数包括默认构造函数、拷贝构造函数、拷贝赋值操作符和析构函数。除了12.1中的情况,当程序不显式地声明这些函数时,编译器会隐式声明它们;如果使用了它们,编译器还会隐式地定义这些函数,如12.1,12.4和12.8所示。

declspec的专栏 756

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++标准ISO-IEC-14882-2003:第9章:类 -第1节:类名

 9 类1.        类是一种类型。在它的作用域内,该类型的名字称为类名。类名:       标识符       模板idClass-specifiers和elaborated-type-specifiers用来描述类名。类的对象是由一系列(可能为空)的成员和基类对象。clas

declspec的专栏 936

假人有限元模型

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

C++标准ISO-IEC-14882-2003:第14章:模板-第3节:模板实参

 14.3 模板实参 1.      对应模板形参的三种形式,模板实参也有三种形式:类型、非类型和模板。模板 id 中指定的每个模板实参的类型和形式应该与其声明时模板形参列表中相应的形参的类型和形式相匹配。【例:template class Array { T* v; int sz; public:

declspec的专栏 1191

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第7节:构造与析构

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty

declspec的专栏 689

C++标准ISO-IEC-14882-2003:第9章:类-第3节:成员函数

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty

declspec的专栏 733

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第2节:临时对象

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Styl

declspec的专栏 566

C++标准ISO-IEC-14882-2003:第9章:类-第2节:类的成员

 9.2 类的成员类描述:成员声明 类描述opt访问描述符 : 类描述opt成员声明:声明描述符序列opt 成员声明器列表opt ;函数定义 ;opt::opt嵌套名字声明

declspec的专栏 762

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第6节:初始化

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

declspec的专栏 760

C++标准ISO-IEC-14882-2003:第14章:模板-第1节:模板的参数

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

declspec的专栏 952

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第8节:拷贝对象

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

declspec的专栏 798

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第5节:自由存储管理

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty

declspec的专栏 800

C++标准ISO-IEC-14882-2003:第14章:模板

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <object class

declspec的专栏 1292

C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第3节:类型转换

12.3 类型转换1.        对象的类型转换可以用构造函数和转换函数来指定。这些转换称为用户自定义的转换,用作隐式类型转换、初始化和显式类型转换。2.        只有在无二义性的情况下,用户自定义的转换才有效。转换遵循权限控制规则。权限检查在二义性解析之后发生。3.        【13.3讨论了函数中

declspec的专栏 527

C++标准ISO-IEC-14882-2003:第14章:模板-第4节:类型等价

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <!-- /* Sty

declspec的专栏 985
上一篇: C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第3节:类型转换
下一篇: C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第5节:自由存储管理
declspec
博客等级 码龄21年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值