工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 1938|回复: 7

关于C++赋值操作符

[复制链接]
发表于 2008-4-15 12:12 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. using namespace std;
  3. class Complex{
  4.         public:
  5.                 double x,y;
  6.                 Complex(double _x=0.0,double _y=0.0):x(_x),y(_y){}
  7.                 Complex(const Complex&rhs){
  8.                         cout<<"Complex(const Complex&) called "<<endl;
  9.                         x=rhs.x;
  10.                         y=rhs.y;        
  11.                 }
  12.                 Complex& operator=(const Complex& rhs){
  13.                         cout<<"operator=(const Complex&) called "<<endl;
  14.                         if(this==&rhs)return *this;
  15.                         x=rhs.x;
  16.                         y=rhs.y;
  17.                         return *this;
  18.                 }
  19.                 void print(){
  20.                         std::cout<<x<<"+"<<y<<"i"<<std::endl;
  21.                 }
  22.                 ~Complex(){
  23.                         std::cout<<"destructing..."<<std::endl;
  24.                 }
  25. };

  26. Complex operator+(const Complex&a,const Complex&b){
  27.         Complex result(a.x+b.x,a.y+b.y);
  28.         result.print();
  29.         return result;
  30. }

  31. int main(){
  32.         Complex a(3,6);
  33.         Complex b(5,63.4);
  34.         a.print();
  35.         b.print();
  36.         Complex c=a+b;//情况二:如果把这句分为两句:Complex c; c=a+b;
  37.         c.print();
  38.         return 0;
  39. }
复制代码
Complex c=a+b;时 operator= 不会被调用
Complex c; c=a+b; 则operator= 会被调用

什么原因。。。。
发表于 2008-4-15 12:37 | 显示全部楼层
Complex c=a+b;调用的是拷贝构造函数.
Complex c; c=a+b;先构造了c,再调用赋值函数.
回复

使用道具 举报

 楼主| 发表于 2008-4-15 12:55 | 显示全部楼层
我的疑问是Complex c=a+b;
为什么不是先对a+b生成一个临时的对象然后再执行赋值

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

使用道具 举报

发表于 2008-4-15 13:06 | 显示全部楼层
because construct.:victory:
回复

使用道具 举报

发表于 2008-4-16 01:10 | 显示全部楼层
不懂C plus plus的路过....
回复

使用道具 举报

发表于 2008-4-19 18:47 | 显示全部楼层
原帖由 iptton 于 2008-4-15 12:55 发表
我的疑问是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);这样更易理解...
回复

使用道具 举报

发表于 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;  等价。
回复

使用道具 举报

发表于 2008-4-19 22:50 | 显示全部楼层
这就是赋值和初始化的区别吧.[em021]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-8-30 10:39

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表