iptton 发表于 2008-4-15 12:12

关于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= 会被调用

什么原因。。。。

hjack 发表于 2008-4-15 12:37

Complex c=a+b;调用的是拷贝构造函数.
Complex c; c=a+b;先构造了c,再调用赋值函数.

iptton 发表于 2008-4-15 12:55

我的疑问是Complex c=a+b;
为什么不是先对a+b生成一个临时的对象然后再执行赋值

一开始我是这样估计的..

hjack 发表于 2008-4-15 13:06

because construct.:victory:

jinry 发表于 2008-4-16 01:10

不懂C plus plus的路过....

hjack 发表于 2008-4-19 18:47

原帖由 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);这样更易理解...

onttpi 发表于 2008-4-19 21:26


我的疑问是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;等价。

hjack 发表于 2008-4-19 22:50

这就是赋值和初始化的区别吧.
页: [1]
查看完整版本: 关于C++赋值操作符