C++临时性对象的生命周期详细解析
发布时间:2023-01-22 04:26:01
有关临时对象的生命周期有三种情况:
1)一般情况:临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。该完整表达式造成临时对象的产生。
实例代码如下:
#include <iostream>
using namespace std;
class A
{
public:
A(int i): m_i(i)
{
cout << "A(): " << m_i << endl;
}
~A()
{
cout << "~A(): " << m_i << endl;
}
A operator+(const A& rhs)
{
cout << "A operator+(const A& rhs)" << endl;
return A(m_i + rhs.m_i);
}
int m_i;
};
int main()
{
A a1(1), a2(2);
a1 + a2;
cout << "------------------------------------" << endl; //运行到这里,a1 + a2产生的临时变量已经被释放
return 0;
}
运行结果为:
2)凡含有表达式执行结果的临时性对象,应该存留到object的初始化操作完成为止。
示例代码如下:
#include <iostream>
using namespace std;
class A
{
public:
A(int i = 0): m_i(i)
{
cout << "A(): " << m_i << endl;
}
~A()
{
cout << "~A(): " << m_i << endl;
}
A operator+(const A& rhs)
{
cout << "A operator+(const A& rhs)" << endl;
return A(m_i + rhs.m_i);
}
A& operator=(const A& rhs)
{
cout << "A& operator=(const A& rhs)" << endl;
m_i += rhs.m_i;
return *this;
}
int m_i;
};
int main()
{
A a1(1), a2(2);
A a3;
a3 = a1 + a2; //a1 + a2产生的临时变量在a3的赋值操作完成后,才释放
return 0;
}
运行结果为:
3)如果一个临时性对象被绑定于一个reference,对象将残留,直到被初始化之reference的生命结束,或直到临时对象的生命范畴(scope)结束——视哪一种情况先到达而定。
示例代码如下:
#include <iostream>
using namespace std;
class A
{
friend ostream& operator<<(ostream& os, const A&);
public:
A()
{
}
A(const A&)
{
cout << "A(const A&)" << endl;
}
~A()
{
cout << "~A()" << endl;
}
};
ostream& operator<<(ostream& os, const A&)
{
os << "ostream& operator<<(ostream& os, const A&)" << endl;
return os;
}
const A& f(const A& a)
{
return a;
}
int main(int argc, char* argv[])
{
{
const A& a = A();
cout << "-------------------" << endl;
}//直到被初始化之reference的生命结束
cout << f(A()) << endl; //直到临时对象的生命范畴(scope)结束:
//临时对象的const引用在f的参数上(而不是返回值)。
//这个引用在f()返回的时候就结束了,但是临时对象未必销毁。
cout << "-------------------" << endl;
return 0;
}
运行结果:


猜你喜欢
- 前言上一篇已经对线程池的创建进行了分析,了解线程池既有预设的模板,也提供多种参数支撑灵活的定制。本文将会围绕线程池的生命周期,分析线程池执行
- 今天来写一个通用的筛选栏的实现,也是因为之前项目中要好多地方用到筛选栏这么个东西,所以为了之后用起来比较方便,就简单的做了一些封装.废话不多
- 发现问题最近发现在mybatis中如果使用的字段是Oracle的关键字,会出现错误,通过查找相关的资料终于解决了,下面来一起看看详细的解决方
- 本文实例讲述了Java后台线程操作。分享给大家供大家参考,具体如下:一 点睛有一种线程,它是后面运行的,它的任务是为其他线程提供服务,这种线
- 简介Arthas 是Alibaba开源的Java诊断工具,动态跟踪Java代码;实时监控JVM状态,可以在不中断程序执行的情况下轻松完成JV
- android中的下拉菜单联动应用非常普遍,android中的下拉菜单用Spinner就能实现,以下列子通过简单的代码实现 * 菜单联动。一
- 话不多说,请看代码:public FileResult GetExcelFile() {  
- 上文我们讨论了一种最简单的线性结构——顺序表,这节我们要讨论另一种线性结构——链表。什么是链表了,不要求逻辑上相邻的数据元素在物理存储位置上
- 1. 前言我们知道,在日常开发中使用的 HashMap 是线程不安全的,而线程安全类 HashTable 和 SynchronizedMap
- Viewpager通俗一点讲就是一个允许左右翻转带数据的页面的布局管理器,经常用来连接Fragment,它很方便管理每个页面的生命周期,使用
- 使用@Indexed加快启动速度Spring读取@Component组件(派生性),有两种实现方式,一种是反射,一种是ASM。反射性能低主要
- 目录引言简单遍历筛选符合某属性条件的List集合获取某属性返回新的List集合获取以某属性为key,其他属性或者对应对象为value的Map
- 大家真正在工作中开发 java 应用都会使用eclipse,myeclipse, IntelliJ等等不过依然值得花10分钟学习如何使用最原
- 今天给大家带来一个自定义的底部导航,我不会做动图,只能搞一张图片给大家看看,大家见谅这个就是自定义的tablayout底部搞好的样式了Tab
- 1.概述最近一直都在带实习生做项目,发现自己好久没有写博客了,这几天更新会比较频繁,今天玩QQ的时候发现QQ主页菜单滑动效果早就变了,实在忍
- 安装容易出现的问题以及解决方法:1、更新sdk时可能无法连接服务器,可在C:\WINDOWS\system32\drivers\etc下的h
- 一.什么是多渠道打包在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包。在安装包
- 目录一、常用属性、方法和事件1.常用属性2.常用方法3.常用事件二、应用实例1.实例描述2.属性设置3.事件处理4.实现代码总结一、常用属性
- //哈弗曼编码的实现类public class HffmanCoding { private int c
- Java与Scala创建List与Map//JavaList<String> languages = new ArrayList