服务器之家

服务器之家 > 正文

详解C++ 中的临时对象

时间:2021-09-26 12:25     来源/作者:Dabelv

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

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

?
1
Integer inte= Integer(5); //用无名临时对象初始化一个对象

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

例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class Integer
{
public:
  Integer(int i):m_val(i){}
  ~Integer(){}
private:
  int m_val;
};
 
void testFunc(Integer itgr)
{
  // do something
}

那么语句:

?
1
2
int i = 10;
testFunc(i);

会产生一个临时对象,作为实参传递到testFunc函数中。

3.函数返回一个对象时,会产生临时对象。以返回的对象最作为拷贝构造函数的实参构造一个临时对象。

?
1
2
3
4
5
6
7
8
9
10
11
Integer Func()
{
  Integer itgr;
  return itgr;
}
 
void main()
{
  Integer in;
  in = Func();
}

如下代码验证以上结论:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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;
}

运行结果:

详解C++ 中的临时对象

思考:

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

?
1
Integer re=inter;//输出Assignment operator还是Copy Constructor

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

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

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

?
1
Integer re=testFunc(10);

按照以上讨论,推理出输出结果应该是:

Integer Constructor
before return
Integer Copy Constructor
Integer Copy Constructor

但实际结果是:

详解C++ 中的临时对象

原因是编译器自动优化的结果,只执行一次Copy Constructor来构造新的对象,不会再次调用Copy Constructor,以临时对象来构造新的对象。

以上就是详解C++ 中的临时对象的详细内容,更多关于c++ 临时对象的资料请关注服务器之家其它相关文章!

原文链接:https://cloud.tencent.com/developer/article/1177549

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
返回顶部