关于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,我们前几天考试考到了,我晕。差点没做出来……