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;
}
|
运行结果:
思考:
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
但实际结果是:
原因是编译器自动优化的结果,只执行一次Copy Constructor来构造新的对象,不会再次调用Copy Constructor,以临时对象来构造新的对象。
以上就是详解C++ 中的临时对象的详细内容,更多关于c++ 临时对象的资料请关注服务器之家其它相关文章!
原文链接:https://cloud.tencent.com/developer/article/1177549