C++重载运算符的形式及规则
运算符实际上是一个函数,所以运算符的重载就是函数的重载。
1、那么重载运算符是干什么用的呢?
C++的数据类型分为两种:基本数据类型、构造数据类型。
基本数据类型可以通过运算符直接完成算术运算。
类作为新构造的数据类型,同样可以使用直接运算。例如:
#include<iostream>
using namespace std;
class C{
public:
int x;
C(int i){
x=i;
}
};
int main(){
C p1(2);C p2(3);
cout<<p1.x+p2.x<<endl;
return 0;
}
程序可以正确输出结果5,但是使用运算符直接求和形式单一、不利于复制,如果要实现多个对象的累加其代码的可读性会大大降低。
使用重载运算符方法就可以解决这些问题。
2、重载运算符的声明形式如下:
operator 类型名();
operator是需要重载的运算符,整个语句没有返回类型,因为类型名就代表了它的返回类型。重载运算符将对象转换成类型名规定的类型,转换时的形式就像强制转换一样,但如果没有重载运算符定义,直接用强制转换编译器将无法通过编译。
重载运算符不可以是新创建的运算符,只能说C++语言中已有的运算符。
可以重载的运算符如下:
算术运算符: + 、 - 、 * 、 / 、 % 、++ 、 – 。
位操作运算符:& 、| 、~ 、 ^ 、 >> 、 << 。
逻辑运算符: ! 、&& 、 || 。
比较运算符:< 、 > 、 >= 、 <= 、== 、!= 。
赋值运算符:= 、+= 、-= 、* = 、 /= 、 %= 、 &= 、 |=、 ^= 、 <<= 、>>= 。
其他运算符:[] 、()、 ->、 逗号、 new 、delete、 new[] 、delete[]、 ->* 。
并不是所有的C++语言中已有的运算符都可以重载。
不允许的运算符有:. 、::、 ?、 :: 。
重载运算符时不能改变运算符操作数的个数,不能改变运算符原有的优先级,不能改变运算符原有的结合性,不能改变运算符原有的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。重载运算符含义必须清楚,不能有二义性。
3、以加法重载函数为例:
#include<iostream>
using namespace std;
class C{
public:
int x;
C(int i){
x=i;
}
C operator+(C p){
return C(x+p.x);
}
void show(){
cout<<x<<endl;
}
};
int main(){
C p1(2);p1.show();
C p2(3);p2.show();
C p3(0);p3=p1+p2;p3.show();
return 0;
}
关键点在于
通过p3=p1+p2调用了
C operator+(C p){
return C(x+p.x);
}
该函数返回值的是一个带参数的类的对象。这个结果值是以p1为主体,以p1.x为基数,把p2当作要加上的类,加上p2.x,最终将p(5)返回到p3上,实现了构造数据类型的重载加法。
类C重载了求和运算符后,由它声明的两个对象C1、C2可以像两个整型变量一样相加。
结果图:
4、重载运算符后可以完成对象和对象之间的运算,同样也可以通过重载运算实现对象和普通类型数据的运算。
#include<iostream>
using namespace std;
class C{
public:
int x;
C(int i){
x=i;
}
C operator+(int y){
return C(x+y);
}
void show(){
cout<<x<<endl;
}
};
int main(){
C p1(2);p1.show();
C p2(0);p2=p1+10;p2.show();
return 0;
}
结果图:
来源:CSDN
作者:翟翟翟aaa
链接:https://blog.csdn.net/zhaizhaizhaiaaa/article/details/104076819