1. 程式人生 > 實用技巧 >c ++運算子過載

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

參考:https://github.com/Light-City/CPlusPlusThings