关于C++赋值操作符
#include <iostream>using namespace std;
class Complex{
public:
double x,y;
Complex(double _x=0.0,double _y=0.0):x(_x),y(_y){}
Complex(const Complex&rhs){
cout<<"Complex(const Complex&) called "<<endl;
x=rhs.x;
y=rhs.y;
}
Complex& operator=(const Complex& rhs){
cout<<"operator=(const Complex&) called "<<endl;
if(this==&rhs)return *this;
x=rhs.x;
y=rhs.y;
return *this;
}
void print(){
std::cout<<x<<"+"<<y<<"i"<<std::endl;
}
~Complex(){
std::cout<<"destructing..."<<std::endl;
}
};
Complex operator+(const Complex&a,const Complex&b){
Complex result(a.x+b.x,a.y+b.y);
result.print();
return result;
}
int main(){
Complex a(3,6);
Complex b(5,63.4);
a.print();
b.print();
Complex c=a+b;//情况二:如果把这句分为两句:Complex c; c=a+b;
c.print();
return 0;
}Complex c=a+b;时 operator= 不会被调用
Complex c; c=a+b; 则operator= 会被调用
什么原因。。。。
Complex c=a+b;调用的是拷贝构造函数.
Complex c; c=a+b;先构造了c,再调用赋值函数. 我的疑问是Complex c=a+b;
为什么不是先对a+b生成一个临时的对象然后再执行赋值
一开始我是这样估计的.. because construct.:victory: 不懂C plus plus的路过.... 原帖由 iptton 于 2008-4-15 12:55 发表 https://www.gdutbbs.com/images/common/back.gif
我的疑问是Complex c=a+b;
为什么不是先对a+b生成一个临时的对象然后再执行赋值
一开始我是这样估计的..
是生成一个临时对象. 但并不是赋值.
Complex c=a+b;这句.实际上执行了
!C
operator+() called //a+b
Complex(x,y) called //生成一个临时对象,其实是你在operator+()里调用的构造函数.
print 8+69.4i //operator+操作输出的.
Complex(const Complex&) called //用该临时对象去构建c
destructing... //销毁临时对象.
!D
其实写成Complex c(a+b);这样更易理解...
我的疑问是Complex c=a+b;
为什么不是先对a+b生成一个临时的对象然后再执行赋值
一开始我是这样估计的..
Complex c(a+b);很容易明白
Complex c=a+b;就有点想不明白了...
不明白的地方是 c=a+b 中的=号为什么不用调用 operator=()
是不是存在其它构造法则?
或者是编译器进行的优化?
以我对C++的理解:
Complex c=a+b;
这句话应该是这样的顺序:
是先执行 a+b 然后这里产生一个临时变量
是执行 Complex c 产生一个默认构造的实例
再后,c=a+b 对c进行赋值
简而言之:Complex c=a+b; 似乎应该和 Complex c;c=a+b;等价。 这就是赋值和初始化的区别吧.
页:
[1]