详解C++ 中的临时对象
C++中临时对象(TemporaryObject)又称无名对象。临时对象主要出现在如下场景。
1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象。
Integerinte=Integer(5);//用无名临时对象初始化一个对象
2.构造函数作为隐式类型转换函数时,会创建临时对象,用作实参传递给函数。
例:
classInteger { public: Integer(inti):m_val(i){} ~Integer(){} private: intm_val; }; voidtestFunc(Integeritgr) { //dosomething }
那么语句:
inti=10; testFunc(i);
会产生一个临时对象,作为实参传递到testFunc函数中。
3.函数返回一个对象时,会产生临时对象。以返回的对象最作为拷贝构造函数的实参构造一个临时对象。
IntegerFunc() { Integeritgr; returnitgr; } voidmain() { Integerin; in=Func(); }
如下代码验证以上结论:
classInteger { public: Integer() { cout<<"IntegerdefaultConstructor"<m_val=arg.m_val; cout<<"IntegerCopyConstructor"< m_val=arg.m_val; } ~Integer(){}; intm_val; }; IntegertestFunc(Integerinter) { inter.m_val++; cout<<"beforereturn"< 运行结果:
思考:
1.main函数中加入如下一条语句会输出什么?
Integerre=inter;//输出Assignmentoperator还是CopyConstructor推理应该输出Assignmentoperatorfunction。但实际输出结果是:IntegerCopyConstructor。
原因是:赋值符函数不能创建新的对象,它要求”=”的左右对象均已存在,它的作用就是把”=”右边的对象的值赋给左边的对象。
2.main函数中加入如下一条语句会输出什么?
Integerre=testFunc(10);按照以上讨论,推理出输出结果应该是:
IntegerConstructor
beforereturn
IntegerCopyConstructor
IntegerCopyConstructor但实际结果是:
原因是编译器自动优化的结果,只执行一次CopyConstructor来构造新的对象,不会再次调用CopyConstructor,以临时对象来构造新的对象。
以上就是详解C++中的临时对象的详细内容,更多关于c++临时对象的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。