C 運算子過載需要注意的地方

2021-12-29 21:01:45 字數 1177 閱讀 2191

有時候自己寫乙個類,需要過載運算子,但對於一些操作符(如==、等),可以在類裡寫,也可以在類外寫。那麼 c++ 編譯器會去怎麼呼叫呢?

首先,我們知道,「過載」 機制可以允許多個函式有相同的函式名,但引數列表必須不同。c++編譯器經過名字改編(name mangling),可以在呼叫時依據所傳實參找到「最符合」的函式實體進行呼叫。而運算子過載亦是如此。

首先,我們有乙個類:

[cpp] 

class cmycls ;  

void f1 (cmycls& lhs, const cmycls& rhs);   

void f2 (const cmycls& lhs, const cmycls& rhs);   

void f3 (cmycls& lhs, cmycls& rhs);   

void f4 (const cmycls& lhs, cmycls& rhs) 

那麼 f1 - f4 這四個函式將會如何呼叫呢?其實,f1函式會調到cmycls類中1 處注釋所標的函式,f2會調到 2 處注釋所標的函式,f3、f4依次類推。

那麼,如果我在類裡面有乙個運算子過載,在類外也有,會呼叫哪乙個呢?比如:

[cpp]

class cmycls 

};   

bool operator == (const cmycls& lhs, const cmycls& rhs)   

void f(const cmycls& lhs, const cmycls& rhs) 

但很不幸的是,這樣編不過。因為對於 f 函式的呼叫來說,編譯器不知道調哪乙個會比較好,因為同時存在兩份「最適合」的過載函式,所以產生歧義。但這樣是可以編過的,思考下為什麼:

[cpp]

class cmycls 

};   

bool operator == (const cmycls& lhs, const cmycls& rhs)   

void f1(const cmycls& lhs, const cmycls& rhs) 

www.2cto.com  

void f2(cmycls& lhs, const cmycls& rhs) 

上面 f1會調到全域性的函式operator ==,而f2會調到 cmycls的成員函式operator ==。所以,最好的寫法是只在類裡或類外過載兩個引數均為const的版本。

過載及運算子過載需要注意的地方

運算子過載 operator overload 是c 的乙個重要的新特性,它使得程式設計師把c 運算子定義擴充套件到運算元是物件的情況.運算子過載的目的是使c 程式更加直觀,更易懂.但這種方便有時候也帶來一些潛在的危險 運算子過載和普通的過載一樣 作用域相同,函式名字相同,但引數不同 引數個數,引數...

位運算子 需要注意的地方

本人第乙個部落格,以後會經常寫 此時的我就像戲台上的老將軍 以免第二次犯同樣的錯誤。因為考研的原因,好久沒有coding了,略感生疏。瘋玩了十幾天,決定拿起書本,紮實地重新看一遍專業書。從開始學習程式設計起,就不是很注重位運算,因為覺得可以用別的方法代替。後來發現有些東西用位運算處理更有效率。這裡主...

使用 strpos 需要注意 運算子

首先應該知道 strpos 函式可能返回布林值 false,但也可能返回乙個與 false 等值的非布林值,例如 0 或者 我們應使用 運算子來測試本函式的返回值。判斷字串是否存在的函式 function strexists haystack,needle test mystring abc fin...