c 基礎複習2 過載

2021-10-04 05:52:12 字數 2460 閱讀 9073

運算子過載 實質是函式過載,在實現過程中,

首先把指定的運算表示式轉化為對運算子函式的呼叫,運算物件轉化為運算子函式的實參。

然後根據實參的型別來確定需要呼叫的函式。

特點:這個過程是在編譯過程中完成的。 

過載之後運算子的優先順序和結合性都不會改變。

過載的功能應當與原有功能相類似。

當運算子過載為類的成員函式時,函式的引數個數比原來的運算數個數要少乙個(字尾++、--除外);當過載為類的友元函式時,引數個數與原運算數的個數相同。

一般來講,單目運算子最好過載為成員函式,而雙目運算子則最好過載為友元函式。

運算子過載的主要優點就是允許改變使用於系統內部的運算子的操作方式,以適應使用者新定義型別的類似運算。 

單目運算指運算所需變數為乙個的運算子,即在運算當中只有乙個運算元,又叫一元運算子,運算子包括賦值運算子、算術運算子、邏輯運算子、位邏輯運算子、位移運算子、關係運算子、自增自減運算子。

雙目運算子是值運算所需變數為兩個的運算子,例如+,-,*,/,%,<,>,>=,<=,==,!=,<<,>>,&,^,|,&&,||,=

運算所需變數為三個的運算子叫做三目運算子,只有條件表示式【?:】

型別轉換運算子【(型別)】、指標運算子和取位址運算子【*和&】、長度運算子【sizeof】

運算子過載的實現

運算子的過載形式有兩種:過載為類的成員函式和過載為類的友元函式。

運算子過載為類的成員函式的語法形式如下:

《函式型別》 operator 《運算子》(《形參表》)

friend 《函式型別》 operator 《運算子》(《形參表》)

《函式型別》 operator ++();        //字首運算

《函式型別》 operator ++(int);     //字尾運算 

complex operator - ()

complex& operator ++ ()

complex operator ++ (int)

對於雙目運算子,乙個運算數是物件本身的資料,由this指標給出。

complex operator - (complex  &arg)  

「->」運算子是成員訪問運算子,這種一元的運算子只能被過載為成員函式,所以也決定了它不能定義任何引數。一般成員訪問運算子的典型用法是:

物件->成員,基本不耗時間。

成員訪問運算子「->」函式過載的一般形式為:

type class_name::operator->();  // 耗時間,盡量不要使用。

賦值運算子過載

在c++中有兩種型別的賦值運算子:

一類是「+=」和「-=」等先計算後賦值的運算子。

一類是「=」即直接賦值的運算子, 建議都過載,效率比編譯器生成的高。

注意:直接賦值,如果乙個類包含指標成員,採用這種預設的按成員賦值,那麼當這些成員撤消後,記憶體的使用將變得不可靠

sample &operator = (sample &s)

下標運算子過載函式只能作為類的成員函式,不能作為類的友元函式。

下標運算子「[ ]」函式過載的一般形式為:

type class_name::operator[ ](arg_);

其中arg為該過載函式的引數。過載了的下標運算子只能且必須帶乙個引數,該引數給出下標的值。過載函式operator[ ]的返回值型別type是引用型別。 

new和delete只能被過載為類的成員函式,不能過載為友元。而且,無論是否使用關鍵字static進行修飾,過載了的new和delete均為類的靜態成員函式, 建議自己過載。

運算子new過載的一般形式為:

void *class_name::operator new(size_t,);

new過載應返回乙個無值型的指標,且至少有乙個型別為size_t的引數。若該過載帶有多於乙個的引數,則其第乙個引數的型別必須為size_t。

運算子delete過載的一般形式為:

void *class_name::operator delete(void *,);

delete過載應返回乙個無值型的指標,且至少有乙個型別為無值型指標的引數。該過載最多可以帶有兩個引數,若有第二個引數,則其第二個引數的型別必須為size_t。 

逗號運算子是雙目運算子,和其他運算子一樣,也可以通過過載逗號運算子來完成期望完成的工作。逗號運算子構成的表示式為「左運算數,右運算數」,該表示式返回右運算數的值。如果用類的成員函式來過載逗號運算子,則只帶乙個右運算數,而左運算數由指標this提供。 

不穩定,不建議使用

型別轉換運算子過載函式的格式如下:

operator 《型別名》()

與以前的過載運算子函式不同的是,型別轉換運算子過載函式沒有返回型別,因為《型別名》就代表了它的返回型別,而且也沒有任何引數。在呼叫過程中要帶乙個物件實參。 

實際上,型別轉換運算子將物件轉換成型別名規定的型別。轉換時的形式就像強制轉換一樣。如果沒有轉換運算子定義,直接用強制轉換是不行的,因為強制轉換只能對標準資料型別進行操作,對類型別的操作是沒有定義的。

索引器(2)過載

看了 陳廣老師的索引器挺不錯的 學習了class coursescore public string name set public int courseid set public int score set class coursescoreindexer public int this stri...

C 入門(6)過載

過載 using system class vector 獲取向量的長度 public double getlength 過載運算子 public static bool operator vector a,vector b 過載運算子 public static bool operator vec...

C 問題4 過載

在同一作用域類,一組函式的函式名相同,引數列表不同 引數個數不同或者引數型別不同 返回值可同可不同。過載函式通常用來在同乙個作用域內,用同乙個函式名命名一組功能相似的函式,這樣做減少了函式名的數量,避免了名字空間的汙染,對於程式的可讀性有很大的好處。1 多型 用同乙個東西表示不同的形態。2 多型分為...