C 運算子過載與型別轉換

2021-09-29 00:18:26 字數 1869 閱讀 7697

當乙個過載的運算子是成員函式時,this繫結到左側運算物件。成員運算子函式的(顯式)引數數量比運算物件的數量少乙個。

通常情況下,不應該過載逗號、取位址、邏輯與和邏輯或運算子。

關於過載運算子的返回型別(應與其內建版本的返回型別相容):

邏輯和關係運算子應該返回bool,算術運算子應該返回乙個類型別,賦值運算子和復合賦值運算子應該返回左側運算物件的乙個引用。

關於將運算子定義為成員函式還是普通的非成員函式的抉擇:

過載與內建運算子的區別:過載必須具有至少乙個class或者列舉型別的運算元;過載不保證求值順序(如短路特性)

相同點:優先順序、結合性、運算元的數目都不變。

io運算子,必須將其定義成非成員函式。io運算子通常需要讀寫類的非公有資料成員,io運算子一般被宣告為友元。

如果類同時定義了算術運算子和相關的復合賦值運算子,則通常情況下應該使用復合賦值來實現算術運算子。

賦值運算子

5、下標運算子:如果乙個類包含下標運算子,則它通常會定義兩個版本:乙個返回普通引用,另乙個是類的常量成員並且返回常量引用。

遞增和遞減運算子:

為了與內建版本保持一致,前置運算子應該返回遞增或遞減後物件的引用。

後置運算子應該返回物件的原值(遞增或遞減之前的值),返回的形式是乙個值而非引用。

區別前置與後置的方式:後置版本接受乙個額外的(不被使用)int型別的形參。若通過函式呼叫的方式呼叫後置版本,則必須為它的整形引數傳遞乙個值。

7、成員訪問運算子:

過載的箭頭運算子必須返回類的指標或者自定義了箭頭運算子的某個類的物件。

8、函式呼叫運算子:

lambda是函式物件:預設情況下lambda不能改變它捕獲的變數。因此預設情況下,lambda產生的類當中的函式呼叫運算子是乙個const成員函式。若lambda被宣告為可變的,則呼叫運算子就不是const的了。

表示lambda及相應捕獲行為的類:引用捕獲,值捕獲(變數拷貝)

lambda表示式產生的類不含預設建構函式、賦值函式及預設析構函式。是否含有預設的拷貝/移動建構函式則通常要視捕獲的資料成員型別而定。

標準庫定義的函式物件:

//統計大於1024的值有多少個

count_if(vec.begin(), vec.end(), bind2nd(greater(), 1024));

//找到第乙個不等於pooh的字串

find_if(vec.bein(), vec.end(), bind2nd(not_equal_to(), "pooh"));

//將所有值乘以2

transform(vec.begin(), vec.end(), vec.begin(), bind2nd(multiplies(), 2));

標準庫function型別

//簡單的桌面計算器 處理int二元運算

#include#include#include#includeusing namespace std;

map> binops = ,,,

,};int main()

9、過載、型別轉換與運算子

型別轉換運算子(類的成員函式,無返回型別,無形參): operator  type()  const   

顯式的型別轉換運算子:如果表示式被用作條件,則編譯器會將顯式的型別轉換自動應用於它。

向bool型別轉換通常用在條件部分,因此operator bool一般定義成explicit的。

過載 型別轉換與運算子

轉換建構函式和型別轉換運算子共同定義了類型別轉換 class type conversions 型別轉換運算子 型別轉換運算子是類的一種特殊成員函式,它負責將乙個類型別的值轉換成其他型別。型別轉換函式的一般形式如下所示 operator type const 其中type表示某種型別。型別轉換運算子...

過載 型別轉換與運算子

前面我們看到由乙個實參呼叫的非顯式建構函式定義了一種隱式的型別轉換,這種建構函式將實參型別的物件轉換成類型別。我們同樣能定義對於類型別的型別轉換,通常定義型別轉換運算子可以做到這一點。轉換建構函式和型別轉換運算子共同定義了類型別轉換,這樣的轉換有時也被稱作使用者定義的型別轉換。型別轉換運算子 型別轉...

C 型別轉換運算子過載

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