c ++運算子過載
運算子過載是C++的一項強大功能。通過過載,可以擴充套件C++運算子的功能,使它們能夠操作使用者自定義的資料型別,增加程式程式碼的直觀性和可讀性。
本章主要介紹 類成員運算子過載與友元運算子過載, 二元運算子與一元運算子過載, 運算子++、--、[]、()過載, this指標與運算子過載及 流運算子<<和>>的過載
一、過載二元運算子
1、二元運算子的呼叫形式與解析
aa@bb 可解釋成 aa.operator@(bb)
或解釋成 operator@(aa,bb)
如果兩者都有定義,就按照過載解析
class X{ public: void operator+(int); X(int); }; void operator+(X,X); void operator+(X,double);
2、類運算子過載形式
(1)非靜態成員運算子過載
以類成員形式過載的運算子引數比實際引數少一個,第1個引數是以this指標隱式傳遞的。
class Complex{
double real,image;
public:
Complex operator+(Complex b){……}
......
};
(2) 友元運算子過載
如果將運算子函式作為類的友元過載,它需要的引數個數就與運算子實際需要的引數個數相同。比如,若用友元函式過載Complex類的加法運算子,則形式如下:
class Complex{ …… friend Complex operator+(Complex a,Complex b); //宣告 //...... }; Complex operator+(Complex a,Complex b){……} //定義
二、過載一元運算子
1、一元運算子
一元運算子只需要一個運算引數,如取地址運算子(&)、負數(?)、自增加(++)等。
2、一元運算子常見呼叫形式為:
@a 或 a@ //隱式呼叫形式
a.operator@() // 顯式呼叫一元運算子@
其中的@代表一元運算子,a代表運算元。
@a代表字首一元運算,如“++a”;
a@表示字尾運算,如“a++”。
3、@a將被C++解釋為下面的形式之一
a.operator@()
operator@(a)
4.一元運算子作為類成員函式過載時不需要引數,其形式如下:
class X{ …… T operator@(){……}; }
T是運算子@的返回型別。從形式上看,作為類成員函式過載的一元運算子沒有引數,但實際上它包含了一個隱含引數
即呼叫物件的this指標。
5.前自增(減)與後自增(減)
C++編譯器可以通過在運算子函式引數表中是否插入關鍵字int 來區分這兩種方式
//字首
operator -- ();
operator -- (X & x);
//字尾
operator -- (int);
operator -- (X & x, int);
三、過載賦值運算子=
1、賦值運算子“=”的過載特殊性
賦值運算進行時將呼叫此運算子
只能用成員函式過載
如果需要而沒有定義時,編譯器自動生成,該版本進行bit-by-bit拷貝
四、過載賦值運算子[]
1、[ ]是一個二元運算子,其過載形式如下:
class X{
……
X& operator[](int n);
};
2、過載[]需要注意的問題
- []是一個二元運算子,其第1個引數是通過物件的this指標傳遞的,第2個引數代表陣列的下標
- 由於[]既可以出現在賦值符“=”的左邊,也可以出現在賦值符“=”的右邊,所以過載運算子[]時常返回引用。
- []只能被過載為類的非靜態成員函式,不能被過載為友元和普通函式。
五、過載( )
1、運算子( )是函式呼叫運算子,也能被過載。且只能被過載為類的成員函式。
2、運算子( )的過載形式如下:
class X{
……
X& operator( )(引數表);
};
其中的引數表可以包括任意多個引數。
3、運算子( )的呼叫形式如下:
X Obj; //物件定義
Obj()(引數表); //呼叫形式1
Obj(引數表); //呼叫形式2