认识C++中的临时对象temporary object
来源:互联网 发布:淘宝网拖鞋 编辑:程序博客网 时间:2024/05/01 20:56
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++中的临时对象temporary object
- 探讨“临时对象”(temporary object)
- 临时对象 (Temporary objects)
- 2# Temporary Objects(临时对象)
- c/c++-c++中的临时对象问题
- Object-C中的数字对象
- JS 使用List<Object> 对象中的Object对象的某个属性的临时处理方法
- object-c中的对象的释放
- Object-C类和对象中的self
- Temporary Tables临时表
- Temporary Tables临时表
- C++中的临时对象
- C++中的临时对象
- C++中的临时对象
- C++中的临时对象
- C++中的临时对象
- 函数中的临时对象
- JS中this学习笔记
- 笔记
- I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之USB HOST移植
- shell中$(( ))与$( )还有${ }的区别
- 研发管理04:软件开发项目管理-操作篇
- 认识C++中的临时对象temporary object
- 自学Swift-斯坦福笔记整理(第四天开始)
- 进程间通信(五):共享内存
- python自然语言处理nltk库常用接口
- C# 利用 HttpWebRequest 和 HttpWebResponse 模拟登录有验证码的网站
- 博弈问题入门
- 揭秘风水师:最高年入百万 客户有市委书记等高官
- Path相关方法讲解(一)
- POJ 1042 解题报告