读书人

关于return的疑问解决方案

发布时间: 2012-02-20 21:18:24 作者: rapoo

关于return的疑问
下面是一个运算符重载成员函数的实例:
class complex
{
public:
complex operator + (complex c2);
private:
double real;
double imag;
};
complex complex::operator(complex c2)
{
return complex(real+c2.real,imag+c2.imag);
}
int main()
{
complex c1(5,4),c2(2,10),c3;
c3=c1+c2;
return 0;
}

上面return会创建一个临时无名对象作为返回值,那么请问下c3=c1+c2的操作是下面哪个?
1:调用complex类的拷贝构造函数把临时无名对象赋值给c3
2: 直接把c3的作为无名对象的名字

偶是c++初学者,只是希望多了解点c++的机制,还有如果想了解这方面知识有高手推荐一点么?感激不尽~

[解决办法]
2.
如果是1的话。太费事!
[解决办法]
这样写比较好
$ cat op.cc

C/C++ code
class complex{public:    complex( double real_ = 0, double imag_ = 0 ): real(real_), imag(imag_){}    complex& operator += ( const complex& other )    {        real += other.real;        imag += other.imag;        return *this;    }    friend const complex operator + ( const complex& lhs, const complex & rhs )    {        complex tmp( lhs );        tmp += rhs;        return tmp;    }  //complex operator + (complex c2);private:  double real;  double imag;};//complex complex::operator(complex c2)//{//  return complex(real+c2.real,imag+c2.imag);//}int main(){    complex c1(5,4),c2(2,10),c3;    c3=c1+c2;    return 0;}
[解决办法]
应该是1
但编译器是可以可以优化的,
假如
complex c3 = c1+c2;
无名对象可以直接作为C3
好像vc2008有一个开关直接可以控制这个,忘记叫啥了
[解决办法]
错鸟。。。

是2
术语是返回值优化

http://hi.baidu.com/sweeteye/blog/item/c35f91510c42948b8d543022.html
[解决办法]
至少在VC6.0里面是1,我们前几天考试考到了,我晕。差点没做出来……

读书人网 >C++

热点推荐