c – 如何创建临时对象以及实际执行的操作是什么?
作者:互联网
任何人都可以解释这段代码的输出是:
deleting 0xbfc69f7c 3,7
deleting 0xbfc69f84 2,4
deleting 0xbfc69f8c 1,3
为什么在从重载运算符返回期间创建的临时对象析构函数不会被调用.在函数内部创建的Fraction对象及其临时副本是否相同,析构函数只调用一次,我想不应该是这种情况.任何人都可以解释这里发生的实际操作.
提前致谢!
class Fraction{
int num ;
int den ;
public:
Fraction( int x = 0 , int y = 0 ){ num = x ; den = y ; }
Fraction( const Fraction & f ){
cout<<"Copy Constructor for "<<f.num<<" , "<<f.den<<endl ;
num = f.num ;
den = f.den ;
}
Fraction operator+( const Fraction& f) const{
int x = f.num + num ;
int y = f.den + den ;
return Fraction(x,y) ;
}
~Fraction(){
cout<<"deleting "<<this<<" "<<num<<","<<den<<endl ;
}
};
int main() {
Fraction f1(1,3);
Fraction f2( 2, 4 );
Fraction f3 = f1 + f2 ;
return 0;
}
解决方法:
这是因为return value optimization和copy elision(感谢Joachim).临时对象将被删除.
标签:temporary-objects,c,destructor,copy-constructor 来源: https://codeday.me/bug/20190829/1763179.html