一、重载运算符
在C++中,不只是函数可以重载,某些运算符也是可以重载的,即可以自定义运算符的功能,可以重载的运算符如下:
运算符 | 名称 | 类型 |
---|---|---|
, | 逗号 | 二进制 |
! | 逻辑“非” | һԪ |
!= | 不相等 | 二进制 |
% | ȡģ | 二进制 |
%= | 取模赋值 | 二进制 |
& | 按位“与” | 二进制 |
& | address-of | һԪ |
&& | 逻辑“与” | 二进制 |
&= | 按位“与”赋值 | 二进制 |
( ) | 函数调用 | ― |
( ) | 强制转换运算符 | һԪ |
* | 乘法 | 二进制 |
* | 指针取消引用 | һԪ |
*= | 乘法赋值 | 二进制 |
+ | 添加 | 二进制 |
+ | 一元加 | һԪ |
++ | 递增1 | һԪ |
+= | 加法赋值 | 二进制 |
- | 减法 | 二进制 |
- | 一元求反 | һԪ |
-- | 递减1 | һԪ |
-= | 减法赋值 | 二进制 |
-> | 成员选择 | 二进制 |
->* | 指向成员的指针选定内容 | 二进制 |
/ | 除法 | 二进制 |
/= | 除法赋值 | 二进制 |
< | 小于 | 二进制 |
<< | 左移 | 二进制 |
<<= | 左移赋值 | 二进制 |
<= | 小于或等于 | 二进制 |
= | 赋值 | 二进制 |
== | 相等 | 二进制 |
> | 大于 | 二进制 |
>= | 大于或等于 | 二进制 |
>> | 右移 | 二进制 |
>>= | 右移赋值 | 二进制 |
[ ] | 数组下标 | ― |
^ | 异或 | 二进制 |
^= | 异或赋值 | 二进制 |
| | 按位“与或” | 二进制 |
|= | 按位“与或”赋值 | 二进制 |
|| | 逻辑“或” | 二进制 |
~ | 二进制反码 | һԪ |
delete | Delete | ― |
new | New | ― |
conversion operators | 转换运算符 | һԪ |
不可重载的运算符:
Operator | Name |
. | 成员选择 |
.* | 指向成员的指针选定内容 |
:: | 范围解析 |
? : | 条件运算 |
# | 预处理器转换为字符串 |
## | 预处理器串联 |
在将这些运算符重载之后,运算符就被赋予了的新的功能,重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表:
Complex operator+(const Complex&, const Complex&);//重载+运算符 实现两个复数相加
部分运算符实例如下,实现过程见注释:
①:二元运算符重载
①:二元运算符重载
#include <iostream> 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<bits/stdc++.h> 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<t2 return 1 else return 0 if(month<x.month){return true;} else if(month==x.month){ if(day<x.day){return true;} else if(day==x.day){ if(hour<x.hour){return true;} else if(hour==x.hour){ if(minute<=x.minute){return true;} else return false; } else return false; } else return false; } else return false; } }; int main() { Time x(8,20,19,19); Time y(5,20,19,19); if(x<y) cout<<"True"; else cout<<"False"; return 0; }
③:输入/输出运算符重载
#include<bits/stdc++.h> 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<<t.month<<"月"<<t.day<<"日"<<t.hour<<"时"<<t.minute<<"分"; return 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<<x<<endl; cin>>y; cout<<y; return 0; }
④:递增(++)递减(--)运算符重载
#include <iostream> 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 <<"分"<<endl; } // 重载前缀递增运算符( ++ ) Time operator++ () { ++minutes; // 对象加 1 if(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 然后return该对象 *i++ 先创建临时对象Temp 把原始值赋值给Temp 然后对Temp的数据+1 return Temp *两种加法产生的效果一样 *后加会添加一个形参int 用于区分前加还是后加 并无实际作用 operator++( int ) */ }; int main() { Time T1(11, 59), T2(10,40); ++T1; // T1 加 1 T1.displayTime(); // 显示 T1 ++T1; // T1 再加 1 T1.displayTime(); // 显示 T1 T2++; // T2 加 1 T2.displayTime(); // 显示 T2 T2++; // T2 再加 1 T2.displayTime(); // 显示 T2 return 0; } /*当上面的代码被编译和执行时,它会产生下列结果: *12点0分 *12点1分 *10点41分 *10点42分 */
⑤:赋值运算符重载
#include<bits/stdc++.h> 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;//无参构造函数 } void display(){ cout<<month<<"月"<<day<<"日"<<hour<<"时"<<minute<<"分"<<endl; } //重载=操作符 实现两个时间对象的赋值 void operator=(const Time &x){ month=x.month; day=x.day; hour=x.hour; minute=x.minute; } }; int main() { Time x(5,21,13,14); Time y; cout<<"Time x:"<<endl; x.display(); y=x; cout<<"Time y:"<<endl; y.display(); return 0; }
⑥:函数调用运算符() 下标运算符 [] 重载 【只能用成员函数重载 不能用友元函数重载】
#include <iostream> using namespace std; class Distance { private: int feet; // 0 到无穷 int inches; // 0 到 12 public: // 所需的构造函数 Distance(){ feet = 0; inches = 0; } Distance(int f, int i){ feet = f; inches = i; } // 重载函数调用运算符 Distance operator()(int a, int b, int c) { Distance D; // 进行随机计算 D.feet = a + c + 10; D.inches = b + c + 10 ; return D; } // 显示距离的方法 void displayDistance() { cout << "F: " << feet << " I:" << inches << endl; } }; int main() { Distance D1(11, 10), D2; cout << "First Distance : "; D1.displayDistance(); D2 = D1(10, 10, 10); // invoke operator() cout << "Second Distance :"; D2.displayDistance(); return 0; } /*当上面的代码被编译和执行时,它会产生下列结果: First Distance : F: 11 I:10 Second Distance :F: 30 I:30*/
//重载[]运算符
#include <iostream> using namespace std; const int SIZE = 10; class safearay { private: int arr[SIZE]; public: safearay() { register int i; for(i = 0; i < SIZE; i++) { arr[i] = i; } } int& operator[](int i) { if( i > SIZE ) { cout << "索引超过最大值" <<endl; // 返回第一个元素 return arr[0]; } return arr[i]; } }; int main() { safearay A; cout << "A[2] 的值为 : " << A[2] <<endl; cout << "A[5] 的值为 : " << A[5]<<endl; cout << "A[12] 的值为 : " << A[12]<<endl; return 0; } /* A[2] 的值为 : 2 A[5] 的值为 : 5 A[12] 的值为 : 索引超过最大值 0 */
文章来源: C++重载运算符和标准模板库(STL)