一、重载运算符
在C++中,不只是函数可以重载,某些运算符也是可以重载的,即可以自定义运算符的功能,可以重载的运算符如下:
运算符 |
名称 |
类型 |
, |
逗号 |
二进制 |
! |
逻辑“非” |
一元 |
!= |
不相等 |
二进制 |
% |
取模 |
二进制 |
%= |
取模赋值 |
二进制 |
& |
按位“与” |
二进制 |
& |
address-of |
一元 |
&& |
逻辑“与” |
二进制 |
&= |
按位“与”赋值 |
二进制 |
( ) |
函数调用 |
— |
( ) |
强制转换运算符 |
一元 |
* |
乘法 |
二进制 |
* |
指针取消引用 |
一元 |
*= |
乘法赋值 |
二进制 |
+ |
添加 |
二进制 |
+ |
一元加 |
一元 |
++ |
递增1 |
一元 |
+= |
加法赋值 |
二进制 |
- |
减法 |
二进制 |
- |
一元求反 |
一元 |
-- |
递减1 |
一元 |
-= |
减法赋值 |
二进制 |
-> |
成员选择 |
二进制 |
->* |
指向成员的指针选定内容 |
二进制 |
/ |
除法 |
二进制 |
/= |
除法赋值 |
二进制 |
< |
小于 |
二进制 |
<< |
左移 |
二进制 |
<<= |
左移赋值 |
二进制 |
<= |
小于或等于 |
二进制 |
= |
赋值 |
二进制 |
== |
相等 |
二进制 |
> |
大于 |
二进制 |
>= |
大于或等于 |
二进制 |
>> |
右移 |
二进制 |
>>= |
右移赋值 |
二进制 |
[ ] |
数组下标 |
— |
^ |
异或 |
二进制 |
^= |
异或赋值 |
二进制 |
| |
按位“与或” |
二进制 |
|= |
按位“与或”赋值 |
二进制 |
|| |
逻辑“或” |
二进制 |
~ |
二进制反码 |
一元 |
delete |
Delete |
— |
new |
New |
— |
conversion operators |
转换运算符 |
一元 |
不可重载的运算符:
Operator |
Name |
. |
成员选择 |
.* |
指向成员的指针选定内容 |
:: |
范围解析 |
? : |
条件运算 |
# |
预处理器转换为字符串 |
## |
预处理器串联 |
在将这些运算符重载之后,运算符就被赋予了的新的功能,重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表:
Complex operator+(const Complex&, const Complex&);//重载+运算符 实现两个复数相加
部分运算符实例如下,实现过程见注释:
①:二元运算符重载
#include
using namespace std;
class Complex {//复数类
public:
double re, im;//实部 虚部
Complex(){//无参构造函数
}
Complex(double x,double y){//含参构造函数
re=x;
im=y;
}
Complex operator+( Complex &x );//重载+运算符 实现复数相加
void Display( ) {cout << re << ", " << im << endl; }
};
Complex Complex::operator+( Complex &x ) {
return Complex( re + x.re, im + x.im );
}
int main() {
Complex a = Complex( 1.2, 3.4 );
Complex b = Complex( 5.6, 7.8 );
Complex c = Complex( 0.0, 0.0 );
c = a + b;
c.Display();
}
②:关系运算符重载
#include
using namespace std;
class Time//时间类
{
private:
int month;
int day;
int hour;
int minute;
public:
Time(int mon,int d,int h,int m){//含参构造函数
month=mon;
day=d;
hour=h;
minute=m;}
Time(){month=day=hour=minute=0;//无参构造函数
}
//重载<操作符 实现时间大小的比较
bool operator<(const Time &x){//如果时间t1
③:输入/输出运算符重载
#include
using namespace std;
class Time//时间类
{
private:
int month;
int day;
int hour;
int minute;
public:
Time(int mon,int d,int h,int m){//含参构造函数
month=mon;
day=d;
hour=h;
minute=m;}
Time(){month=day=hour=minute=0;//无参构造函数
}
//重载<<操作符
friend ostream &operator<<(ostream &out,const Time &t){
out<
>操作符 friend istream &operator>>(istream &in,Time &t){ in>>t.month>>t.day>>t.hour>>t.minute; return in; } }; int main() { Time x(8,8,8,8); Time y; cout<
>y; cout<
④:递增(++)递减(--)运算符重载
#include
using namespace std;
class Time
{
private:
int hours; // 0 到 23
int minutes; // 0 到 59
public:
// 所需的构造函数
Time(){
hours = 0;
minutes = 0;
}
Time(int h, int m){
hours = h;
minutes = m;
}
// 显示时间的方法
void displayTime()
{
cout << hours << "点" << minutes <<"分"<
= 60) { ++hours; minutes -= 60; } return Time(hours, minutes); } // 重载后缀递增运算符( ++ ) Time operator++( int )//int 用于区分前加和后加 { // 创建临时对象,保存原始值 Time T(hours, minutes); // 对象加 1 ++minutes; if(minutes >= 60) { ++hours; minutes -= 60; } // 返回旧的原始值 return T; } /*重载前加和后加的区别: *++i 直接把该对象的值+1