认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏
C++中临时对象又称无名对象。临时对象主要出现在如下场景。
1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象。
Integer inte= Integer(5); //用无名临时对象初始化一个对象
2.构造函数作为隐式类型转换函数时,会创建临时对象,以值的方式传递,用作实参传递给函数。
例:
class Integer
{
public:
Integer(int i):m_val(i){}
~Integer(){}
private:
int m_val;
};
void testFunc(Integer itgr)
{
// do something
}
那么语句:
int i = 10;
testFunc(i);
会产生一个临时对象,作为实参传递到testFunc函数中。
3.函数返回一个对象时,会产生临时对象。以返回的对象最作为拷贝构造函数的实参构造一个临时对象。
Integer Func()
{
Integer itgr;
return itgr;
}
void main()
{
Integer in;
in = Func();
}
如下代码验证以上结论:
class Integer
{
public:
Integer()
{
cout<<"Integer default Constructor"<<endl;
};
Integer(const Integer& arg)
{
this->m_val=arg.m_val;
cout<<"Integer Copy Constructor"<<endl;
};
Integer(int i):m_val(i){
cout<<"Integer Constructor"<<endl;
};
Integer& operator=(const Integer& arg)
{
cout<<"Assignment operator function"<<endl;
this->m_val=arg.m_val;
}
~Integer(){};
int m_val;
};
Integer testFunc(Integer inter)
{
inter.m_val++;
cout<<"before return"<<endl;
return inter;
}
int main(int argc,char* argv[])
{
Integer inter(5);//Constructor
Integer resutl; //default constructor
resutl=testFunc(2);//Constructor,then Copy Constructor,then Assignment operator
cout<<resutl.m_val<<endl;
getchar();
return 0;
}
运行结果:
思考:
1.main函数中加入如下一条语句会输出什么?
Integer re=inter;//输出Assignment operator还是Copy Constructor
推理应该输出Assignment operator function。但实际输出结果是:Integer Copy Constructor。
原因是:赋值符函数不能创建新的对象,它要求”=”的左右对象均已存在,它的作用就是把”=”右边的对象的值赋给左边的对象。
2.main函数中加入如下一条语句会输出什么?
Integer re=testFunc(10);
按照以上讨论,推理出输出结果应该是:
Integer Constructor
before return
Integer Copy Constructor
Integer Copy Constructor
但实际结果是:
原因是编译器自动优化的结果,只执行一次Copy Constructor来构造新的对象,不会再次调用Copy Constructor,以临时对象来构造新的对象。
参考文献
[1]Scott Meyers.More Effective C++(第三版)[M].北京:电子工业出版社,2011.1
[2]http://www.cnblogs.com/daocaoren/archive/2011/07/19/2110258.html
版权声明:本文为博主原创文章,未经博主允许不得转载。
认识C++中的临时对象temporary object 分类: C/C++ 2015-05-11 23:20 137人阅读 评论(0) 收藏的更多相关文章
- javascript中0级DOM和2级DOM事件模型浅析 分类: C1_HTML/JS/JQUERY 2014-08-06 15:22 253人阅读 评论(0) 收藏
Javascript程序使用的是事件驱动的设计模式,为一个元素添加事件监听函数,当这个元素的相应事件被触发那么其添加的事件监听函数就被调用: <input type="button&q ...
- OC基础:类和对象 分类: ios学习 OC 2015-06-12 18:55 17人阅读 评论(0) 收藏
OC:Objective-c 面向对象的c语言,简称obj-c或者OC OC和C的区别 1.OC是C语言的超集,OC是在C语言的基础上结合smalltalk的优点,开发出来的语言.oc兼容所有 ...
- javascript中定义事件的三种方式 分类: C1_HTML/JS/JQUERY 2014-08-07 10:27 634人阅读 评论(0) 收藏
在javascript中,可以为某个元素指定事件,指定的方式有以下三种: 1.在html中,使用onclick属性 2.在javascript中,使用onclick属性 3.在javascipt中,使 ...
- JavaScript中的一些细节 分类: C1_HTML/JS/JQUERY 2014-08-05 16:45 384人阅读 评论(0) 收藏
1.设置id / class等属性 用 setAttribute 设置一些常规属性如 id ,className 的时候经常不起作用,只能用 object.id = value 这样来设置 news_ ...
- AndroidManifest.xml中的application中的name属性 分类: android 学习笔记 2015-07-17 16:51 116人阅读 评论(0) 收藏
被这个不起眼的属性折磨了一天,终于解决了. 由于项目需要,要合并两个android应用,于是拷代码,拷布局文件,拷values,所有的都搞定之后程序还是频频崩溃,一直没有找到原因,学android时间 ...
- ArcGIS for Server的安装及站点中的集群配置 分类: ArcGIS for server 2015-07-18 14:14 16人阅读 评论(0) 收藏
坚信并为之坚持是一切希望的原因. (不足之处,欢迎批评指正!) --------------------环境:Windows server2008R2虚拟机两台----------------- ...
- jQuery中的on()和click()的区别 分类: 前端 HTML jQuery 2014-11-06 10:26 96人阅读 评论(0) 收藏
HTML页面代码 <div> <h1>Click</h1> <button class="add">Click me to add ...
- C语言中返回字符串函数的四种实现方法 2015-05-17 15:00 23人阅读 评论(0) 收藏
C语言中返回字符串函数的四种实现方法 分类: UNIX/LINUX C/C++ 2010-12-29 02:54 11954人阅读 评论(1) 收藏 举报 语言func存储 有四种方式: 1.使用堆空 ...
- 【C#小知识】C#中一些易混淆概念总结(四)---------解析Console.WriteLine() 分类: C# 2014-02-05 17:18 1060人阅读 评论(0) 收藏
目录: [C#小知识]C#中一些易混淆概念总结 [C#小知识]C#中一些易混淆概念总结(二) [C#小知识]C#中一些易混淆概念总结(三) ------------------------------ ...
随机推荐
- Delphi 使用之dll文件生成与调用
DLL是Dynamic-Link Libraries(动态链接库)的缩写,库里面是一些可执行的模块以及资源(如位图.图标等).可以认为DLL和EXE基本上是一回事,只是DLL不能直接执行,而必须由应用 ...
- Deep Learning 17:DBN的学习_读论文“A fast learning algorithm for deep belief nets”的总结
1.论文“A fast learning algorithm for deep belief nets”的“explaining away”现象的解释: 见:Explaining Away的简单理解 ...
- Java命令提示符编译
Java利用命令提示符编译 1:最简单的方式:直接编译 /** 文件路径:G:\测试项目\java\src 文件名称:JacaText.java 编写时间:2016/6/2 作 者:郑晨辉 编写说明: ...
- angular 三目运算符 需要换色或style
解决方法:直接简单粗暴写两个.有点挫,但实现需求了. <font style="color:red" ng-show="boxlist.lineTitle.leng ...
- javascript数组常用方法汇总
1.join()方法: Array.join()方法将数组中所以元素都转化为字符串链接在一起,返回最后生成的字符串.也可以指定可选的字符串在生成的字符串中来分隔数组的各个元素.如果不指定分隔符,默认使 ...
- SVN+Apache域用户认证配置方法_Windows(转,重新排版,部分内容更新优化)
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
- SSM框架学习之高并发秒杀业务--笔记2-- DAO层
上节中利用Maven创建了项目,并导入了所有的依赖,这节来进行DAO层的设计与开发 第一步,创建数据库和表. 首先分析业务,这个SSM匡济整合案例是做一个商品的秒杀系统,要存储的有:1.待秒杀的商品的 ...
- Question and Answer
1.VS2013使用EntityFrame问题解决办法 解决办法参照博客http://pinter.org/?p=2374 使用到EntityFrame的项目配置文件修改如下: 项目中凡是使用到DbC ...
- Android学习(未完)
Android四大组件1.Activity活动活动Activity是一种可以包含用户界面的组件,主要用于和用户进行交互活动之间使用intent进行通信,激活组件,分为1.显式intent2.隐式int ...
- Android Studio 查看密钥库证书指纹SHA1
打开DOC命令窗体