C++重载运算符的形式及规则

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;
} 

结果图:
通过重载运算实现对象和普通类型数据的运算

发布了16 篇原创文章 · 获赞 30 · 访问量 2051

猜你喜欢

转载自blog.csdn.net/zhaizhaizhaiaaa/article/details/104076819
今日推荐