运算符
C++提供了许多标准的运算符,如=、-、*、/、%、&等,在C++中,运算符也是可以像函数那样进行重载的。
运算符的重载实际上是函数的重载,在C++中,每一个运算符对应着一个运算符函数,例如:
int x,y;
x+y;
表达式 x+y 在编译前,将被解释为函数调用形式:
operator+(x,y)
这里的 operator 是一个关键字,它与后面的 + 共同组成了该函数的函数名,所以运算符可以向函数那样进行重载。
运算符重载的一般格式
<返回类型> operator <运算符> (<参数表>){
<函数体>
}
运算符重载的特点
相比起普通函数的重载,运算符的重载使用了关键字 operator 对重载函数进行标识和定义。但是重载运算符时应注意:
- 只能重载已有的运算符
- 重载以后运算符的优先级、结合性和语法结构均不改变
运算符重载的三种形式如下:
运算符分类 | 常规表示 | operator表示形式 | 参数个数 |
---|---|---|---|
前缀 | +a | operator+(a,0) | 一元 |
中缀 | a+b | operator+(a,b) | 二元 |
后缀 | a++ | operator++(a) | 一元 |
可重载的运算符
算术运算符:+,-,*,/,%,++,--;
位操作运算符:&,|,~,^(位异或),<<(左移),>>(右移)
逻辑运算符:!,&&,||;
比较运算符:<,>,>=,<=,==,!=;
赋值运算符:=,+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=;
其他运算符:[],(),->, ,(逗号运算符),new,delete,new[],delete[],->*
不可重载的运算符
(1)"."(类成员访问运算符)
(2)" .*"(类成员指针访问运算符)
(3) "::"(域运算符)
(4)"sizeof"(长度运算符)
(5) " ?:"(条件运算符)
示例
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass();
int data;
};
MyClass::MyClass()
{
data = 0;
}
// 重载 +
MyClass operator+(MyClass classA, MyClass classB) {
MyClass classC;
classC.data = classA.data + classB.data;
return classC;
}
// cout 是 ostream 类的对象
// ostream 类和 cout 都是在头文件 <iostream> 中声明的
// ostream 类将<<重载为成员函数,而且重载了多次
// 为了使用cout,ostream 类需要将<<进行如下重载:
ostream& operator<<(ostream& os, const MyClass& c)
{
os << c.data;
return os;
}
int main() {
MyClass aClass, bClass, cClass;
aClass.data = 10, bClass.data = 60;
cClass = aClass + bClass;
cout << cClass << endl;
return 0;
}