<一>关于运算符重载
  xs9mrAcZVTZn 2023年11月02日 65 0
C++

C++的运算符重载:使对象的运算表现得和编译器内置类型一样
如下代码,如果T是整形,那很好理解,但是如果 T 是一个 Student 类, a + b ?怎么操作,两个学生类怎么相加?
这个就是我们要说的运算符重载问题

template<typename T>
T sum(T a,T b){
   return a + b;  // a.+(b)  => a.operator+(b)  operator+ 就是我们需要的函数
}
CComplex operator+(const CComplex &lhs, const CComplex &rhs){

   reutrn CComlex(lhs.x+rhs.x,lhs.y+rhs.y);
   // 由于不能再类外访问CComplex的私有成员,所以我们可以加上友元
   // 在CComplex 加上 firend CComplex operator+(const CComplex &lhs, const CComplex &rhs);

}

ostream & operator<<(ostream & cout, const CComplex & val){
    cout<<"Complex = "<<val.x <<" "<<val.y<<endl;
    return out
}



class CComplex{

public:
  CComplex(int _x=1,int _y=1):x(_x),y(_y){}

  Complex operator+(const CComplex & _com){
       CComplex _comp;
       _comp.x= this->x + _com.x
       _comp.y= this->y +_com.y;
       return _comp;
  }

  //后置++,返回的是 + 之前的值
  Complex operator++(int){
     CComplex tep=*this;
     x++;
     y++;
     return tep;
  }

  //前置++ 返回加后的值
  Complex & operator++(){
     x++;
     y++;
     return *this;
  }

  //+=不需要返回值
  void operator+=(const CComplex & _value){
      x=x+_value.x;
      y=y+_value.y;
  }


private:
    int x;
    int y;
    firend CComplex operator+(const CComplex &lhs, const CComplex &rhs);
    firend ostream & operator<<(ostream & cout, const CComplex & val) ;
}

int main(){
    
    CComplex comp1(100,200);
    CComplex comp2(1,2);
    CComplex  comp3=comp1 + comp2;


    CComplex  comp4=comp1 + 20;//comp1.operator+(CComplex tep) => comp1.operator+(将20转为CComplex对象) 
   //这个时候编译器会想办法 把 20转为CComplex对象,在上面的类中,可以转,因为 CComplex(int _x=1,int _y=1) 有默认值
   //所以上面代码 会使用20创建一个CComplex 对象,然后 再让他们相加

   CComplex  comp5=30 +comp1;//编译报错 30.operator+(CComplex tep)  整形数的加法运算符里面没有operator+(CComplex tep) 编译器不会把30转为CComplex对象
   
   //编译器在做对象的运算的时候,会调用对象的运算符重载函数(优先调用成员方法),r如果没有成员方法
   //就会在全局作用域中找合适的运算符重载函数 所以 CComplex  comp5=30 +comp1 编译器
   //当在整数中找不到成员方法是,还可以 ::operator+(30,comp1) 在全局作用域中找运算符重载函数
   //就会调用全局作用域中的 CComplex operator+(const CComplex &lhs, const CComplex &rhs) 方法,
   //所以如果希望CComplex  comp5=30 +comp1;编译通过,可以加上全局函数 CComplex operator+(const CComplex &lhs, const CComplex &rhs)


   return 0;
}


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   77   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   54   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   41   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   54   0   0 C++
xs9mrAcZVTZn