前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++中的临时对象

C++中的临时对象

作者头像
恋喵大鲤鱼
发布2018-08-03 17:37:01
1.1K0
发布2018-08-03 17:37:01
举报
文章被收录于专栏:C/C++基础C/C++基础

C++中临时对象(Temporary Object)又称无名对象。临时对象主要出现在如下场景。

1.建立一个没有命名的非堆(non-heap)对象,也就是无名对象时,会产生临时对象。

代码语言:javascript
复制
  Integer inte= Integer(5); //用无名临时对象初始化一个对象

2.构造函数作为隐式类型转换函数时,会创建临时对象,用作实参传递给函数。 例:

代码语言:javascript
复制
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.函数返回一个对象时,会产生临时对象。以返回的对象最作为拷贝构造函数的实参构造一个临时对象。

代码语言:javascript
复制
Integer Func()
{
    Integer itgr;
    return itgr;
}

void main()
{
    Integer in;
    in = Func();
}

如下代码验证以上结论:

代码语言:javascript
复制
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函数中加入如下一条语句会输出什么?

代码语言:javascript
复制
Integer re=inter;//输出Assignment operator还是Copy Constructor

推理应该输出Assignment operator function。但实际输出结果是:Integer Copy Constructor。

原因是:赋值符函数不能创建新的对象,它要求”=”的左右对象均已存在,它的作用就是把”=”右边的对象的值赋给左边的对象。

2.main函数中加入如下一条语句会输出什么?

代码语言:javascript
复制
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]关于C++中的临时对象问题

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年05月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档