一、運算子多載的概念
? C++中的運算式由運算子和運算元按照規則構成,例如,算術運算子包括加“+”、減“-” 、乘“*” 、除“/”和取模“%”,如果不做特殊處理,則這些算術運算子通常只能用于對基本資料型別的常量或變數進行運算,而不能用于物件之間的運算,
? 運算子多載,就是給已有的運算子賦予多重含義,使同一個運算子作用于不同型別的資料時產生不同的行為,運算子多載的目的是使得C++中的運算子也能夠用來操作物件,
? 用于類運算的運算子通常都要多載,有兩個運算子,系統提供了默認的多載版本:賦值運算子=和地址運算子&,


2、多載運算子的規則
- 1)多載后運算子的含義應該符合原有的用法習慣,例如,多載“+”運算子,完成的功能就應該類似于做加法,在多載的“+”運算子中做減法是不合適的,
- 2)運算子多載不能改變運算子原有的語意,包括運算子的優先級和結合性,
- 3)運算子多載不能改變運算子運算元的個數及語法結構,
- 4)不能創建新的運算子,即多載運算子不能超出C++語言允許多載的運算子范圍,
- 5)多載運算子“( )”“[ ]”“->”或者賦值運算子“=”時,只能將它們多載為成員函式,不能多載為全域函式,
- 6)運算子多載不能改變該運算子用于基本資料型別物件的含義,
3、賦值運算子的多載
- C++中的賦值運算子“=”要求左右兩個運算元的型別是匹配的,或至少是賦值兼容的,有時希望“=”兩邊的運算元的型別即使不賦值兼容也能夠成立,這就需要對“=”進行多載,C++規定,“=”只能多載為成員函式,若有類CL的兩個物件s1和s2,則它們之間的賦值陳述句通常是下面這樣的形式:s1=s2;當類CL中定義了成員函式,多載了賦值運算子后,上述賦值陳述句將解釋為函式呼叫的形式:s1.operator=(s2);
4、淺拷貝和深拷貝
- 同類物件之間可以通過賦值運算子“=”互相賦值,如果沒有經過多載,“=”的作用就是將賦值號右側物件的值一一賦值給左側的物件,這相當于值的拷貝,稱為“淺拷貝”,
- 多載賦值運算子后,賦值陳述句的功能是將一個物件中指標成員變數指向的內容復制到另一個物件中指標成員變數指向的地方,這樣的拷貝叫“深拷貝”,
5、多載流插入運算子和流提取運算子
- 在C++中,左移運算子“<<”可以和cout一起用于輸出,故常被稱為“流插入運算子”,右移運算子“>>”和cin—起用于輸入,一般被稱為流提取運算子,它們都是C++類別庫中提供的,在類別庫提供的頭檔案中已經對“<<”和“>>”進行了多載,使之分別作為流插入運算子和流提取運算子,能用來輸出和輸入C++基本資料型別的資料,cout是ostream類的物件,cin是istream類的物件,它們都是在頭檔案iostream中宣告的,因此,凡是用“cout<<”和“cin>>”對基本資料型別資料進行輸出/輸入的,都要用#include指令把頭檔案iostream包含到本程式檔案中,
- 必須多載為類的友元
#include<iostream> #include<typeinfo> using namespace std; class Point { private: int x; public: Point(int x1){x=x1;} int get(); Point operator++(); Point operator++(int x); Point operator--(); Point operator--(int x); void operator+(const Point &p); void operator-(const Point &p); Point& operator=(const Point &p); operator double(); friend void operator<<(ostream & stream,Point obj); }; int Point::get(){ return this->x; } //多載運算子(++obj) Point Point::operator++(){ x++; return *this; } //多載運算子(obj++) Point Point::operator++(int x){ Point temp = *this; this->x++; return temp; } //多載運算子(--obj) Point Point::operator--(){ this->x--; return *this; } //多載運算子(obj--) Point Point::operator--(int x){ Point temp = *this; this->x--; return temp; } //多載運算子+(a+b) void Point::operator+(const Point &p){ this->x=this->x+p.x; } //多載運算子-(a-b) void Point::operator-(const Point &p){ this->x=this->x-p.x; } //復制運算子多載=(a=b),賦值運算子必須多載為成員函式 Point& Point::operator=(const Point &p){ this->x=p.x; return *this; } //多載型別轉換運算子()a Point::operator double(){ cout << "多載型別轉換運算子" << endl; return this->x; } //多載運算子 (cout <<) void operator<<(ostream & stream,Point obj){ stream<< obj.x <<endl; } int main(){ Point point(10); operator<<(cout, point.operator++());//11 Point point2(10); operator<<(cout, point2.operator++(0));//10 Point point3(10); operator<<(cout, point3.operator--());//9 Point point4(10); operator<<(cout, point4.operator--(0));//10 Point point5(1); Point point6(1); point5.operator+(point6); operator<<(cout, point5);//2 point5.operator-(point6); operator<<(cout, point5);//1 Point point7(1); Point point8(5); operator<<(cout, point7.operator=(point8));//5 Point point9(20); cout << typeid(point9.get()).name()<< endl;//i cout << point9.operator double()<< endl; cout << typeid(point9.operator double()).name();//d return 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17328.html
標籤:C++
上一篇:C++ 共用體
下一篇:如何0基礎學習C/C++?
