C 學習筆記 四 運算子過載 型別轉換

2021-08-22 11:45:39 字數 4560 閱讀 8477

6.運算子過載

6.1運算子過載的基本概念

6.2成員函式過載運算子

6.3友元函式過載運算子

6.4成員函式過載運算子和友元函式過載運算子比較

6.5型別轉換

物件導向程式設計的過載有函式過載和運算子過載。函式過載是指在相同作用域內,若干個引數特徵不同的函式使用相同的函式名,也稱為函式名過載;運算子過載是另一種呼叫函式的方法,是指同樣的運算子可以施加於不同型別的運算元上面,也就是對已有的運算子賦予多重含義,使同乙個運算子作用於不同型別的資料時產生不同的行為,是一種靜態聯編的多型。

與函式過載相似,運算子也存在過載問題。c++語言預定義的運算子只適用於基本資料型別。為了解決一些實際問題,程式設計師經常會定義一些新型別,即自定義型別,然而c++不允許生成新的運算子,因此為了實現對自定義型別的操作,就必須自己來編寫函式說明某個運算子如何作用於這些資料型別,這樣的程式可讀性較差。針對這種情況,c++允許過載現有的大多數運算子,也就是允許給已有的運算子賦予新的含義,從而提高了c++的可擴充套件性,使得針對同樣的操作,使用過載運算子比使用顯式函式呼叫更能提高程式的可讀性。

c++語言對運算子過載進行了以下規定限制:

(1)只能過載c++語言中原先已定義的運算子,不能自己創造新的運算子進行過載。

(2)並不是所有的運算子都可以過載。不能進行過載的運算子:」.

」「.*」

「::」「

?:」(3)不能改變運算子原有的優先順序和結合性。

(4)不能改變運算子對預定義型別資料的操作方式,但是可以根據實際需要,對原有運算子進行適當的改造和擴充。

(5)運算子過載有兩種方式:過載為類的成員函式&過載為類的友元函式。

成員函式過載運算子的原型在類的內部

class 類名

;在類外定義成員運算子函式的格式:

返回型別 類名::operator 運算子(形參表)

返回型別是指運算子過載函式的運算結果型別;operator是定義運算子過載函式的關鍵字;運算子是要過載的運算子名稱;形參表中給出了過載運算子所需要的引數和型別。

6.2.1單目運算子過載

用成員函式過載運算子時,如果運算子是單目的,則參數列為空。因為這時運算元訪問該過載運算子的物件本身的資料,該物件有this指標指向,所以參數列為空。

單目運算賦的呼叫有兩種方式:顯式呼叫和隱式呼叫。

(1)顯式:物件名.operator 運算子()

(2)隱式:過載的運算子 物件名

過載」-」運算子:

#include #include using namespace std;

class point

;point::point(int i, int j)

void point::print()

;string::string(char *in_str)

string::string()

;complex::complex(double r, double i)

complex complex::operator+(complex a)

complex complex::operator-(complex a)

void complex::print()

;point::point(int i, int j)

void point::print()

;student::student(char *na, float sco)

student::~student()

void student::print()

;student::student(char *na, float sco)

student::~student()

student & student::operator=(const student &p)

void student::print()

;string::string(char *in_str)

void string::showstring()

過載下標運算子,用一維陣列實現乙個三維向量類:

#include using namespace std;

class vector

;vector::vector(int a1, int a2, int a3)

int & vector::operator(int bi)

過載函式呼叫運算子」()」:

#include using namespace std;

class mat

;mat::mat(int r, int c)

}int &mat::operator()(int r, int c)

int main()

friend 《函式型別》operator《過載的運算子》(《形參1>,《形參2>) //雙目運算子過載

用友元函式過載運算子實現複數的加、減運算:

#include using namespace std;

class complex

;complex::complex(double r, double i)

complex operator+(complex a, complex b)

complex operator-(complex a, complex b)

void complex::print()

;point::point(int i, int j)

void point::print()

;point::point(int i, int j)

void point::print()

;point::point(int i, int j)

void point::print()

如果類complex的物件com要做賦值運算和加法運算,下面的語句時正確的。

com = com + 10;
這是因為物件com是運算子」+」的做運算元,在呼叫過載運算子」+」的函式時,this指標指向com。因此語句temp.real = real + a;相當於temp.real = this->real + a;。而下面的語句就不正確了。

com = 10 + com;
這是因為左運算元是乙個整數,而整數是乙個內部資料型別,不能產生對成員運算子函式的呼叫。解決這類問題的方法是採用兩個友元函式來過載運算子函式」+

」,從而消除運算子」+

」的左運算元是內部資料型別而帶來的問題。

用友元函式過載運算子」+」:

#include using namespace std;

class complex

;complex::complex(double r, double i)

complex operator+(complex a, int c)

complex operator+(int c, complex a)

void complex::print()

;string::string(char *in_str)

string::~string()

void string::showstring()

;complex::complex()

complex::complex(int r)

complex::complex(double r, double i)

complex operator+(complex a, complex b)

void complex::print()

};

其中,源類類名為要轉換的源類型別;目的型別為要轉換成的型別,它既可以是使用者自定義的型別,也可以是系統的預定義型別。

使用類型別轉換函式時,需要注意:

(1)類型別轉換函式只能定義為乙個類的成員函式,而不能定義為類的友元函式。

(2)類型別轉換函式既沒有引數,也不顯式給出返回型別。

(3)類型別函式中必須有

」return目的型別的資料;

」的語句,即必須返回目的型別資料作為函式的返回值。

自定義型別向預定義型別的轉換(顯式呼叫):

#include using namespace std;

class complex

;complex::complex(double r, double i)

;complex::complex(double r, double i)

complex::complex(double i)

complex::operator double()

;class complex

;complex::complex(double r, double i)

complex::operator vector()

vector::vector(double tx, double ty)

void vector::print()

int main()

C 型別轉換運算子過載

在c 中有乙個特殊的運算子過載方法 型別轉換運算子過載,形如 operator type code class cdemo operator int private int x int y code int tmain int argc,tchar argv 執行結果 即 x的值,int 對demo...

c 過載型別轉換運算子

型別轉換運算子 型別轉換運算子是類的一種特殊成員函式,負責將乙個類型別的值轉換成其他型別 乙個型別轉換函式必須是類的成員函式,不能有返回型別,形參列表也必須為空,通常是const的。operator type const class smallint 轉換源,為int型。可將算術型別轉換成small...

C 學習筆記四 運算子過載

當呼叫乙個過載函式和過載運算子時,編譯器通過把您所使用的引數型別和定義中的引數型別相比較,巨鼎選用最合適的定義。過載決策 過載運算子時帶有特殊名稱的函式,函式名是由關鍵字operator和其後要過載的運算子符號構成,與其他函式一樣,過載運算子有乙個返回型別和乙個引數列表。返回型別 operator ...