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

C++语言2011年国际标准 ISO/IEC 14882:2011 C++语言2011年国际标准 ISO/IEC 14882:2011 不是N1570 立即下载

12.2 临时对象

1.         类的临时对象是在很多种上下文中产生的:将一个右值绑定到一个引用上,返回一个右值,创建右值的类型转换,抛出一个异常,进入一个异常处理函数以及某些初始化当中。即使在临时对象的创建被刻意避免的情况下(拷贝对象时),所有的语义约束也必须被当作创建了临时对象一样来看待。【例:即使没有调用拷贝构造函数,所有语义约束比如访问权限等都应该被满足。】

2.         【例

class X {

// ...

public:

// ...

X(int);

X(const X&);

~X();

};

X f(X);

void g()

{

X a(1);

X b = f(X(2));

a = f(a);

}

       对于 X b = f(X(2)) 这句,一种可能的编译器实现是:先在一个临时变量中创建 X(2) ,然后再用 X 的拷贝构造函数将这个临时变量其传给 f() ;另一种可能的实现是:在放置 f() 的参数的地方创建 X(2) 这个对象(不是临时的)。

       同时, f(X(2)) 的返回值可能会用一个临时对象来放置,然后将这个临时对象拷贝给 b ;也可能是另一种情况: b 直接盛放 f(X(2)) 的返回值(返回值直接在 b 这个地方构造)。

       看另外一个例句, a=f(a) 这个表达式也需要一个临时变量:或者替换参数中的 a ,或者替换返回值,从而避免出现 a 的名字混乱问题。

】

3.         当编译器的实现产生了一个类(该类具有非 trivial 构造函数)的临时对象时,编译器必须保证调用该临时对象的构造函数。析构函数也类似。临时对象一般是在表达式计算的最后一步销毁的(该表达式是个完整表达式 【按:不是任何表达式的子表达式】 ,词法上要包含临时对象的创建点);即使该表达式以抛出异常这种形式来作为结束,也是一样的。

4.         临时对象的销毁时机在两种情况下是例外。其一,表达式作为另外一个对象定义时的初始化值,在这种情况下临时对象一直盛放着该表达式的值,直到这另外一个对象的初始化工作完成,它才销毁。这另外一个对象是通过该对临时对象进行拷贝来初始化的;在拷贝的过程中,编译器的实现可以多次调用拷贝构造函数;临时对象在拷贝结束之后,初始化工作结束前或结束时才销毁。如果在初始化值计算的过程中创建了多个临时对象,临时对象会以与创建完成顺序相反的顺序来销毁。

5.         其二,是将临时对象绑定到一个引用时。分两种情况:①引用所绑定的临时对象;②一个临时对象被一个引用给绑定了,同时这个临时对象还是另一个完整对象的子对象【这个完整对象我们称之为该临时对象的外层完整对象】。 ①中的临时对象和②中的外层完整对象一般来说与引用的生命周期相同,除了以下几种情况:

a)         绑定到临时对象的是一个数据成员,该数据成员被用在构造函数的构造初始化器中,这种临时对象的生命周期在构造函数执行完的时候结束

b)        绑定到临时对象的是一个函数的参数,这种临时对象的生命周期在包含这个函数的完整表达式计算完成之后结束

c)        绑定到临时对象的是一个函数的 return 语句的返回值,这种临时对象的生命周期在函数退出的时候结束

在以上 3 种情况中,为了初始化引用而进行的表达式计算所产生的中间临时对象,除了最后绑定到引用的那个临时对象,全部在完整表达式结束之后销毁,销毁顺序与它们创建完成时的顺序向相反。如果两个或多个被绑定的临时对象的生命周期相同,那么它们以创建完成时的相反顺序销毁。除此之外,被绑定的临时对象的销毁过程应该考虑到自动对象和静态对象这些情况;也就是说:假设 obj1 是一个自动或静态对象,它在临时对象之前就被创建了,那么临时对象必须在 obj1 销毁之前销毁;假设 obj2 是一个自动或静态对象,它在临时对象之后才被创建,那么临时对象必须在 obj2 销毁之后销毁。【例:

class C

{

public:

       C();

       C(int);

       friend C operator+(const C&, const C&);

       ~C();

};

C obj1;

const C& cr = C(16)+C(23);

C obj2;

 

表达式 C(16)+C(23) 创建了 3 个临时对象。第一个临时对象 T1 用来盛放 C(16) 这个表达式的值,第二个临时对象 T2 用来盛放 C(23) 这个表达式的值,第三个临时对象 T3 用来盛放这个表达式相加后的结果;然后 T3 就被绑定到了 cr 。 T1 与 T2 谁先创建是没有定义的;假设编译器先创建 T1 ,那它就必须保证 T2 在 T1 之前销毁。 T1 与 T2 被绑定到 operator+ 这个函数的引用类型的参数上。绑定到 cr 上的 T3 在 cr 的生命周期结束的时候被销毁(在本例中,是在程序的结尾)。除此之外, T3 销毁的顺序要考虑到静态存储类型的对象 【按:在本例中,obj1 和obj2 都是全局的,被看作是静态存储类型】 的销毁顺序。也就是说:由于 obj1 在 T3 之前创建, T3 在 obj2 之前创建,所以必须保证 obj2 在 T3 之前销毁, T3 在 obj1 之前销毁。

】

 

深入解析STM32定时器中央对齐模式3的双中断机制 本文深入解析了STM32定时器中央对齐模式3的双中断机制。该模式在一个PWM周期内,会在计数器到达ARR(上溢)和0(下溢)时各触发一次更新中断,实现更精细的实时控制。文章详细阐述了其工作原理、配置方法,并指导如何在中断服务函数中通过DIR位区分中断来源,同时探讨了其在电机控制、数字电源等场景下的应用优势与CPU负载挑战。 阅读详情

相关推荐

Simulink/Requirements Toolbox 学习(一):概述

编写、导入、导出需求并使需求正式化;两种创建需求的模块:需求编辑器、需求透视;描述需求的方式:文本、图像和关键字;通过导入和导出需求文件,与第三方需求管理工具(例如 Microsoft Word、Microsoft Excel®、IBM DOORS和 IBM DOORS Next)集成。涉及模块:Requirements Eidtor、Requirements Table等;

855

c++语言iso标准,C++20标准 (ISO/IEC 14882:2020) 正式发布

ISO C++ 委员会正式发布了C++20 标准,命名为 ISO/IEC 14882:2020。C++20 是一次重大的更新,引入了许多新特性:模块 (Modules)协程 (Coroutines)范围 (Ranges)概念与约束 (Constraints and concepts)指定初始化 (designated initializers)操作符<=> != ==constexpr...

weixin_35519827的博客 2565

Amesim基础篇-元件详解-流体库管路

Amesim基础篇-元件详解-流体库管路

2201_75375391的博客 4524

ISO C++ 2011标准

ISO C++2011标准的基本概况 1.C++2011新标准的目标是提高编程效率,主要体现在下面三个方面 (1)语言方面更加统一 (2)STL标准库 (3)高效率编写自己的抽象和库 2. C++2011的新标准也要带来相对应的编译器,否则编译时会带来编译错误;第5版里面的例子采用最新的GNU编译器编译 3.C++2011组成也主要包含3部分: (1)低级语言,主要继承C语言,也是C

wugc14的博客 2604

强化学习:Distributed PPO (DPPO) 学习笔记

DPPO = Distributed + Proximal Policy Optimization Distributed:多个智能体并行训练 Proximal:限制策略更新幅度,确保稳定性 Policy Optimization:基于策略梯度的优化方法 核心思想:多个智能体并行探索环境,共享经验,通过裁剪策略更新确保训练稳定

只是个人学习笔记 1331

用Coze平台30分钟打造《花光10亿》小游戏:零代码AI开发实战

本文详细介绍了如何利用字节跳动推出的Coze平台,在30分钟内零代码开发一款名为《花光10亿》的AI小游戏。通过配置提示词、集成图像生成插件、构建自动化工作流以及使用数据库功能,即使没有编程基础的用户也能快速将创意转化为可交互的智能应用,体验AI开发的便捷与高效。

weixin_29313547的博客 207

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

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

declspec的专栏 756

从Delta Delay到Timing Window:详解数字芯片后端时序差异的那些坑

本文深入剖析了数字芯片后端设计中,模块级与系统级时序分析结果不一致的核心原因。重点解释了Delta Delay如何导致模块级分析的乐观假设,以及Timing Window(时序窗口)差异如何通过影响串扰噪声计算,在顶层集成时引发新的时序违例,尤其是保持时间问题。文章为工程师提供了从约束建模到签核策略的系统性应对方案。

beer8的博客 499

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

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

declspec的专栏 936

专项1.CCS代码补全与快捷键优化全攻略

本文全面解析CCS开发环境的代码补全功能与快捷键优化技巧,包括内容辅助触发机制、快捷键自定义配置、编码效率提升方法等实用内容。通过详细步骤指导开发者优化CCS配置,实现高效的代码自动补全和个性化快捷键设置,显著提升嵌入式开发效率。

kotlin6android的博客 223

锂电池的充电和放电曲线解读

锂电池充放电曲线是反映其性能的关键指标。充电曲线分为恒流和恒压两阶段:恒流阶段电压快速上升,恒压阶段电流逐渐降低;放电曲线则呈现平台期和快速衰减期特征。这些曲线受温度、充放电倍率及材料体系(如三元锂或磷酸铁锂)显著影响。通过分析曲线特征,可优化电池管理系统,实现精准的SOC估算、快充策略制定及故障诊断,从而在电池性能与安全性间取得平衡。不同应用场景(如新能源汽车或消费电子)对曲线形态有特定要求。

start_up_go的博客 5067

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

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

declspec的专栏 1191

【通信】多径衰落信道的matlab仿真

1 简介 2 部分代码 clearf_c=1e3; %carrier frequency(no modulation)time_1 = (linspace (0, 10, 1000)); %timesignal_in = sin (2 * pi *f_c* time_1); %sine wave plot (time_1, signal_in, 'b');grid on;

qq_59747472的博客 1383

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

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

declspec的专栏 733

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

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

declspec的专栏 760

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

declspec的专栏 952

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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章:类-第2节:类的成员

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

declspec的专栏 762

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章:类的特殊成员函数-第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++标准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:第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++标准

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

3760

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

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值