C++重载运算符和标准模板库(STL)

匿名 (未验证) 提交于 2019-12-03 00:21:02

一、重载运算符

在C++中,不只是函数可以重载,某些运算符也是可以重载的,即可以自定义运算符的功能,可以重载的运算符如下:

运算符名称类型
,逗号二进制
!逻辑“非”һԪ
!=不相等二进制
%ȡģ二进制
%=取模赋值二进制
&按位“与”二进制
&address-ofһԪ
&&逻辑“与”二进制
&=按位“与”赋值二进制
( )函数调用
( )强制转换运算符һԪ
*乘法二进制
*指针取消引用һԪ
*=乘法赋值二进制
+添加二进制
+一元加һԪ
++递增1һԪ
+=加法赋值二进制
-减法二进制
-一元求反һԪ
--递减1һԪ
-=减法赋值二进制
->成员选择二进制
->*指向成员的指针选定内容二进制
/除法二进制
/=除法赋值二进制
<小于二进制
<<左移二进制
<<=左移赋值二进制
<=小于或等于二进制
=赋值二进制
==相等二进制
>大于二进制
>=大于或等于二进制
>>右移二进制
>>=右移赋值二进制
[ ]数组下标
^异或二进制
^=异或赋值二进制
&#124;按位“与或”二进制
&#124;=按位“与或”赋值二进制
&#124;&#124;逻辑“或”二进制
~二进制反码һԪ
deleteDelete
newNew
conversion operators转换运算符һԪ

不可重载的运算符:

OperatorName
.成员选择
.*指向成员的指针选定内容
::范围解析
? :条件运算
#预处理器转换为字符串
##预处理器串联


在将这些运算符重载之后,运算符就被赋予了的新的功能,重载的运算符是带有特殊名称的函数,函数名是由关键字 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 */
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!