-
-
c++中临时对象的产生?编译器优化了?
-
发表于:
2011-10-25 11:16
5888
-
class A
{
friend ostream& operator<<(ostream& os,const A&);
friend A operator+(const A&,const A&);
public:
A(int i=0):m_i(i){cout<<"A(int i=0)"<<endl;}
A(const A& a)
{
m_i=a.m_i;
cout<<"A(const A&)"<<endl;}
const A& operator=(const A& a)
{
cout<<"const A& operator=(const A& a)"<<endl;
m_i=a.m_i;
return *this;
}
~A()
{cout<<"~A()"<<endl;}
private:
int m_i;
};
A operator+(const A& a,const A& b)
{
A c=a.m_i+b.m_i;
return c;
}
ostream& operator<<(ostream& os,const A& a)
{
os<<"ostream& operator<<(operator& os,const A&)"<<endl;
cout<<a.m_i<<endl;
return os;
}
const A& f(const A& a)
{
return a;
}
const A func(const A a)
{
return a;
}
int main(int argc,char**argv)
{
/*const A& a=A();
cout<<"_______________________"<<endl;
cout<<f(A())<<endl;
cout<<"-----------------------"<<endl;
const A b=func(A());
cout<<"as"<<endl;*/
A a1(3),a2(4);
a1+a2;
cout<<"仅仅是区分一下是否产生临时对象:"<<endl;
A c=a1+a2;
cout<<c<<endl;
return 0;
}
上述代码运行结果上半部分在意料之中:a1+a2首先会调用operator+,他的返回方式是按值返回,因此会触发复制构造函数创建函数中c的副本,函数执行完毕c———局部对象被析构掉,a1+a2产生了临时对象,这是表达式,因此临时对象生命周期瞬间到期,马上死掉了,因此再次析构掉此临时对象。2次析构。
后半部分A c=a1+a2;一直到执行完毕总共析构了4次,应该是c(operator中),a1,a2,c(main中)分别析构,那这里a1+a2没产生临时对象吗?如果产生了,那这个临时对象也该被析构的,就应该是析构5次啊,是编译器优化了?那前半部分怎么没优化?另外,如果没优化,那这个临时对象的生命周期是多少?跟c一样长?还是跟前半部分一样,表达式结束到期?
ps:在网上有这样的说法:临时对象的生存时限在这本书中只花了不长的篇章,但说的很清楚,临时对象的生存时限 限制在其出现的“完整”的表达式
中,“完整”的表达式结束了,临时对象也就销毁了。
例外是把临时对象被引用或者初始化给具名对象,临时对象的生存周期
会加长到引用或者具名对象的生存周期。
[课程]FART 脱壳王!加量不加价!FART作者讲授!