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//错误
解决这类问题的方法是,采用两个友元函数来重载+运算符,从而消除由于“+”运算符的左操作数为内部数据类型带来的问题。
- 对于双目运算符,用友元函数重载更方便使用。
- 对于赋值“=”、函数调用“()”、下标“[]”、指针成员引用“->”等运算符,必须使用成员函数重载,否则将导致编译错误。
- 对于流插入“<<”和流提取“>>”运算符,必须使用友元函数重载
- 对于单目运算符(负“-”、指针“*”、取地址“&”),自增“++”、自减“--”等运算符,建议选择成员函数重载。
- 对于复合赋值运算符+=、-=、/=、*=、!=、~=、%=、>>=、<<=,建议用成员函数重载。
- 对于算数运算符、关系运算符、逻辑运算符、位运算符等,建议用友元函数重载。
5、operator和&operator的区分
推荐阅读(operator 与&operator_liujc_的博客-CSDN博客)
关键在于运算符需要连用的话,必须使用&operator
operator返回的是值,&operator返回的是地址