关于运算符重载

1、基本概念

  • 只能重载c++中原先已定义的运算符。
  • 不能进行重载的运算符 “·”“.*”“::”“?:”。
  • 不能改变运算符原有的优先级和结合性
  • 有两种重载方式为类的成员函数类的友元函数

2、成员函数重载运算符

  • 函数声明:返回值类型 operator 重载的运算符(参数);
  • 函数定义:返回值类型 类名::operator 重载的运算符(参数){//函数体}
  • 函数调用(单目):

               显示调用:对象名.opertora 运算符()

               隐式调用:重载的运算符 对象名

//@author T
//@Time 2023/06/10

Point operator -();//函数声明

Point ob;//声明对象ob
ob=ob.operator-()//显式调用
ob=-ob;//隐式调用

//函数定义
Point Point::operator -(){
     //函数体
}
  • 函数调用(双目):

               显示调用:对象名.operator 运算符(参数)

               隐式调用:对象名 重载的运算符 参数

String operator+(const char *astr);//函数声明

String title("C/C++");//声明定义对象
//函数调用
title=title.operator+("Program");//显式调用
title=title+"Program";//隐式调用
//函数定义
String String::operator+(const char *astr){
      //函数体
}
  • 重载++、--运算符

       类名 operator ++( )  //前缀方式

       类名 operator ++(int)  //后缀方式

       类名 operator --( )  //前缀方式

       类名 operator --(int)  //后缀方式

3、友元函数重载运算符

friend Coord operator++(Coord& op);//声明为友元函数

//函数调用
Cord ob(10,20);
++ob;//发挥了重载++的作用

//函数定义
Coord operator++(Coord& op){
      //函数体
}

4、成员函数友元函数重载的区分

​​​​​​       在进行运算符重载时,既可以使用成员函数重载,也可以使用友元函数重载。

          对于双目运算符:用成员函数重载时参数表中有一个参数,而友元函数重载时参数表中有两个参数。

          对于单目运算符:成员函数重载时参数列表中没有参数,友元函数重载有一个参数。

双目运算符一般可以用友元函数重载或成员函数重载,下面的情况必须使用友元。

       

//例如,用成员函数重载“+”运算符
Complex Complex::operator+(int a){
     Complex temp;
     temp.real=real+a;
     temp.imag=image+a;
     return temp;
}

 如果Complex的对象com要做赋值运算和加法运算

对象com是+运算符的左操作数,在调用重载+运算符函数时,this指针指向com。 

com=com+10//正确

//在函数的定义内
temp.real=real+a;//相当temp.real=this->real+a;
//左操作符是一个整数,整数是一个内部数据类型,不能产生对成员运算符的调用

com=10+com//错误

解决这类问题的方法是,采用两个友元函数来重载+运算符,从而消除由于“+”运算符的左操作数为内部数据类型带来的问题。 

  1. 对于双目运算符,用友元函数重载更方便使用。
  2. 对于赋值“=”、函数调用“()”、下标“[]”、指针成员引用“->”等运算符,必须使用成员函数重载,否则将导致编译错误。
  3. 对于流插入“<<”和流提取“>>”运算符,必须使用友元函数重载
  4. 对于单目运算符(负“-”、指针“*”、取地址“&”),自增“++”、自减“--”等运算符,建议选择成员函数重载。
  5. 对于复合赋值运算符+=、-=、/=、*=、!=、~=、%=、>>=、<<=,建议用成员函数重载。
  6. 对于算数运算符、关系运算符、逻辑运算符、位运算符等,建议用友元函数重载。

5、operator和&operator的区分 

推荐阅读(operator 与&operator_liujc_的博客-CSDN博客

关键在于运算符需要连用的话,必须使用&operator

operator返回的是值,&operator返回的是地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值