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

嵌入式开发避坑指南:用DWT做延时函数,这几个细节不注意代码会跑飞 本文深入探讨了在Cortex-M嵌入式开发中使用DWT实现精确延时函数的关键技巧与常见陷阱。针对DWT_CYCCNT计数器应用中的内核兼容性、溢出处理、编译器优化等五大核心问题,提供了工业级稳健解决方案,帮助开发者避免代码跑飞风险,实现微秒级高精度延时控制。 阅读详情

12.7 构造与析构

1.         非平凡类在构造函数执行前和析构函数执行后,访问任何非静态数据成员或其基类都会导致未定义的行为。【例:

struct X { int i; };

struct Y : X { };

struct A { int a; };

struct B : public A { int j; Y y; };

extern B bobj;

B* pb = &bobj; // OK

int* p1 = &bobj.a; // 未定义 , 在 bobj 构造之前就访问其基类子对象了

int* p2 = &bobj.y.i; // 未定义 , 在 bobj 构造之前就访问其非静态数据成员的成员了

A* pa = &bobj; // 未定义 , 在 bobj 构造之前就试图将其向上转换为基类类型

B bobj; // 定义 bobj

extern X xobj;

int* p3 = &xobj.i; // OK, X 是平凡类

X xobj;

       另外一个例子:

       struct W { int j; };

struct X : public virtual W { };

struct Y {

int *p;

X x;

Y() : p(&x.j) // 未定义 , x 尚未创建 【按:x 是数据成员,在p 后声明,因此会在p 之后初始化(构造);而p 初始化的时候访问了x ,所以是未定义的。】

{ }

};

】

2.         如果想显式或隐式地将 X 的指针(左值)转化成 X 的直接或间接基类 B 的指针(引用),那么, X 及其继承于 B 的基类(不论直接还是间接)都必须已经开始构造,并且这些类的析构还没完成;否则该转换会导致未定义的行为。想形成一个对象 obj 的直接非静态成员的指针, obj 的构造必须已经开始并且析构还没结束;否则指针值的计算(或成员的访问)会导致未定义的行为。【例:

struct A { };

struct B : virtual A { };

struct C : B { };

struct D : virtual A { D(A*); };

struct X { X(A*); };

struct E : C, D, X {

E() : D(this), // 未定义 : 从 E* 向上转成 A* ,(如果可以转的话)会使用 E* → D* → A* 这样的路径,但是 D 尚未创建!

// D((C*)this), // 这样就允许了, E* → C* 允许,因为 E() 开始了 【按:且A,B,C 都已经创建,尚未析构,满足条件】; C* → A* 允许,因为 C 已经完全创建

X(this) // 允许 : 此时 A,B,C,D 都已经完全创建

{ }

};

3.         成员函数(包括虚函数)可以在构造和析构的过程中被调用。当在构造函数(包括构造初始化器)或析构函数中直接或间接调用虚函数,并且调用函数的对象正处在构造和析构过程中,实际调用的函数是本类或基类的那个虚函数,而不是覆盖了该虚函数的派生类的那个虚函数。如果被调用的虚函数中调用了另一个成员函数,这个成员函数是用显式的成员访问语法形式调用的,但这种语法形式中调用者的静态类型不是构造函数或析构函数所在的类、也不是其基类的时候,结果是未定义的。【例如:

class V {

public:

virtual void f();

virtual void g();

};

       class A : public virtual V {

public:

virtual void f();

};

class B : public virtual V {

public:

virtual void g();

B(V*, A*);

};

class D : public A, B {

public:

virtual void f();

virtual void g();

D() : B((A*)this, this) { }

};

B::B(V* v, A* a) {

f(); // 调用 V::f , not A::f

g(); // 调用 B::g , not D::g

v->g(); // v 是 B 的基类 , 调用合法 , 调用 B::g

a->f(); // 未定义的行为 , a 的类型不是 B 的基类

}

4.         构造或析构的过程中可以使用 typeid 操作符。当在构造或析构函数(或其调用的函数)中使用 typeid 的时候,如果 typeid 的操作数是这个正在构建的对象时,结果是构造或析构函数所在类的类型信息。如果 typeid 的操作数是这个正在构建的对象,其静态类型既不是构造或析构函数所在的类,又不是其基类,那么结果是未定义的。

5.         构造或析构的过程中可以使用 dynamic_cast 操作符。当在构造或析构函数(或其调用的函数)中使用 dynamic_cast 的时候,如果 dynamic_cast 的操作数是这个正在构建的对象时,该对象被认为是该类的最终继承对象。如果 dynamic_cast 的操作数是这个正在构建的对象或其指针,但其静态类型既不是构造或析构函数所在的类,又不是其基类(或指针),那么结果是未定义的。【例:

class V {

public:

virtual void f();

};

class A : public virtual V { };

class B : public virtual V {

public:

B(V*, A*);

};

class D : public A, B {

public:

D() : B((A*)this, this) { }

};

B::B(V* v, A* a) {

typeid(*this); // B 的 type_info

typeid(*v); // 合法 : *v 的类型是 V, B 的基类;生成 B 的 type_info

typeid(*a); // 未定义的行为 : A 不是 B 的基类

dynamic_cast<B*>(v); // 合法 : v 是 V*, B 的基类 V ;生成 B*

dynamic_cast<B*>(a); // 未定义的行为, a 是 A* 类型, A 不是 B 的基类

}

 

利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行 dronekit: 一种用于无人机控制的python库。 dronekit-sitl:一种本地仿真工具,相当于本地虚拟化了一个无人机。 mavproxy:数据转发软件(类似于插线板的感觉,一个输入,多个相同的输出)。打开一个Anaconda prompt 首先激活相应的环境 然后运行如下命令: 保持2中的Anaconda prompt处于运行状态,另打开一个Anaconda prompt窗口,运行如下命令: tcp:127.0.0.1:5760: SITL默认端口,作为mavproxy的输入,把输入数据转发 阅读详情

相关推荐

华大HC32F460 ADC+DMA高效数据采集实战解析

本文深入解析了华大HC32F460微控制器中ADC与DMA协同工作的高效数据采集方案。通过实战代码演示,详细阐述了如何配置硬件触发、序列扫描及AOS事件联动,实现后台自动采集,从而解放CPU资源,提升系统实时性与可靠性,适用于传感器数据采集、音频处理等多种场景。

weixin_29189373的博客 177

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

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

declspec的专栏 756

程序自动化填写网页表单数据

如何让程序自动化填写网页表单数据,特别是涉及到批量数据情况时,可以减少人力。下面是涉及到的一些场景,都可以通过相关自动化程序实现。

Y 2426

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

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

declspec的专栏 936

单窗算法的地表温度反演:谷歌地球引擎GEE代码

该论文基于Statistical Mono-Window(SMW)算法,对地表温度加以求解。其中,简单地说,SMW算法即是通过简单的线性关系,对由单热红外波段所得的大气表观亮温与地表温度之间的经验关系加以表示,从而计算得到LST。

2301_78834737的博客 556

PMBus协议解析:基于I2C的电源管理实战与TMS320F28003x驱动开发

在嵌入式系统与服务器电源设计中,数字电源管理总线是实现高效、可靠电源监控与控制的关键技术。PMBus协议基于广泛应用的I2C总线物理层,通过定义标准化的命令集、数据格式与时序规范,为多路电源的电压电流监控、动态调整及故障处理提供了高效解决方案。其技术价值在于通过硬件自动处理协议解析、时钟拉伸与中断,显著降低软件复杂度,使开发者能聚焦于电源环路设计等核心逻辑。该协议广泛应用于服务器、通信基站及高性能计算板卡等场景,通过引入数据包错误检查、专用告警线等机制,确保了电源管理的可靠性。本文以TI TMS320F28

weixin_29189377的博客 374

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

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

declspec的专栏 1191

C# 与蓝牙 BLE 设备通信:基于 Windows.Devices.Bluetooth 实现手环/传感器数据读取

本文介绍了如何利用C#的Windows.Devices.Bluetooth命名空间实现与蓝牙BLE设备的通信。首先概述了BLE技术特性及其在物联网中的应用场景,包括智能穿戴设备和传感器。随后讲解了BLE的GATT协议架构,解析了服务(Service)和特性(Characteristic)的概念。文章重点展示了通过C#实现设备扫描、连接、数据读取的完整代码示例,并详细说明了如何使用通知(Notifications)功能实现实时数据更新。最后提供了订阅心率测量特性变化的实现代码,为开发者提供了完整的BLE设备通

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1323

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

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

declspec的专栏 566

uniapp [全端兼容] - 详细实现下拉筛选菜单功能组件,下拉式筛选菜单效果,类似电商美团点击筛选项底部弹出列表点击选择后自动收起(详细示例代码,全端兼容小程序、安卓苹果app、h5网页、nvue

uni-app,vue2,vue3,向下弹出菜单包含筛选功能,日期筛选,下拉框选择器,下拉多条件筛选,下拉式筛选菜单,uniApp如何实现条件下拉筛选,Uniapp官方条件筛选组件,下拉框式条件筛选插件组件,最好用的插件组件,多端兼容,下拉菜单筛选,过滤筛选列表,下拉筛选栏,多列联动的条件筛选,下拉菜单地区和筛选,微信小程序,支付宝小程序,h5网页,移动端网站,安卓app,苹果app,nvue,uniapp所有平台兼容,下拉菜单筛选,下拉式条件筛选,下拉列表,点击排序,级联筛选,uniapp实现下拉筛选

🏆 前端领域优质创作者 1万+

YOLOv8改进:在C2F模块中引入RepGhost Bottleneck模块

C2F类是YOLOv8中的C2F模块的实现,它包含一个RepGhostBottleneck模块、一个卷积层和一个批归一化层。通过在C2F模块中引入RepGhost Bottleneck模块,我们可以在保持计算效率的同时提升模型的表达能力。这是因为RepGhost Bottleneck模块通过引入重复的卷积核来扩展模型的感受野,从而增加了模型对不同尺度目标的感知能力。RepGhost Bottleneck是一种用于卷积神经网络的改进模块,它可以在保持计算效率的同时提升模型的表达能力。希望以上内容对你有帮助!

IlgCrystal的博客 1306

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

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

declspec的专栏 733

习题加餐4. 冒险者工会

这个问题通过贪心算法解决,展示了贪心算法在解决一些优化问题中的强大能力。关键在于如何识别贪心选择的性质,并通过数学证明确保这种方法能够达到全局最优解。通过对问题的深入理解和逻辑推理,我们可以设计出有效的算法来解决问题,同时也需要注意代码实现中的细节,如排序和双指针的使用,以确保算法的效率和正确性。贪心算法的应用这个问题展示了贪心算法在实际问题中的应用。贪心算法通过在每一步选择当前最优的解决方案,期望最终达到全局最优解。该问题中,每次选择能力最接近但足以完成最难任务的冒险者,就是贪心选择的体现。

tang7mj的博客 1350

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

<!-- /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-a

declspec的专栏 825

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

declspec的专栏 798

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

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

declspec的专栏 760

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

declspec的专栏 762

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章:类的特殊成员函数-第3节:类型转换

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

declspec的专栏 527

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章:类的特殊成员函数-第5节:自由存储管理

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

declspec的专栏 800

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

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

declspec的专栏 985

(C++语言)有几种(标准)?

(C++98)全称(ISO / IEC 14882:1998) (C++03)全称(ISO / IEC 14882:2003) (C++14)全称(ISO / IEC 14882:2011) (C++14)全称(ISO / IEC 14882:2014) (C++17)全称(ISO / IEC 14882:2017) ...

weixin_45228122的博客 1482

C++标准ISO-IEC-14882-2003:第14章:模板-第2节:模板特化的名字

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

declspec的专栏 631

C,C++ 的发展和标准化进程

C语言 https://baike.baidu.com/item/c语言 1.K&R C 起初,C语言没有官方标准。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。布莱恩·柯林汉(Brian Kernighan) 和 丹尼斯·里奇(Dennis Ritchie) 出版了一本书,名叫《The C Programming Language》。这本书被

icycolawater的专栏 1037

C标准&C++标准

C: ISO/IEC 9899 C++: ISO/IEC 14882

3760
上一篇: C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第6节:初始化
下一篇: C++标准ISO-IEC-14882-2003:第12章:类的特殊成员函数-第8节:拷贝对象
declspec
博客等级 码龄21年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值