C++临时对象研究

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++临时对象研究相关的知识,希望对你有一定的参考价值。

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

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 Integer Func()

  Integer itgr;
  return itgr;

 
void main()

  Integer in;
  in = Func();

如下代码验证以上结论:

#include <iostream>
#include <vector>
using namespace std;

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,以临时对象来构造新的对象。

以上是关于C++临时对象研究的主要内容,如果未能解决你的问题,请参考以下文章

C++临时对象那些事儿

C++临时对象那些事儿

深入探讨C++中临时对象的常见产生情况及其解决的方案

在进行添加时如何通过使用 c++ 模板来避免临时对象? [关闭]

为啥不同编译器使用 c++ string+string 临时对象有区别? [复制]

C++:调用临时对象的构造函数