1. 程式人生 > >[C++] 過載運算子與型別轉換(2)——函式呼叫運算子和型別轉換運算子

[C++] 過載運算子與型別轉換(2)——函式呼叫運算子和型別轉換運算子

1、這兩個應該是C++中比較高階的用法了。

一、函式呼叫運算子   1、過載函式呼叫運算子(),必須是成員函式,一個類可以定義多個不同版本的呼叫運算子,相互之間應該在引數數量或者型別上有所區別。   2、定義了呼叫運算子的類的物件稱作 函式物件;函式物件常常作為泛型演算法的實參。   3、 lambda表示式就是一個匿名的函式物件。lambda表示式產生的類不含有預設建構函式、賦值運算子及預設解構函式;它是否含有預設的拷貝/移動建構函式則通常要視捕獲的資料成員型別而定。   4、標準庫定義的函式物件   5、 C++語言中幾種可呼叫物件
:函式、函式指標、lambda表示式、bind建立的物件、過載了函式呼叫符的類。   二、型別轉換運算子   1、型別轉換運算子可以對類型別進行型別轉換, 轉換建構函式型別轉換運算子共同定義了類型別轉換。(轉換建構函式就是接受引數型別A的建構函式,一般引數數目為1個,這就定義了從A到類型別的轉換)   2、 型別轉換運算子是類的一種特殊的成員函式,它負責將一個類型別的值轉換成其他型別,形式如下:
operator type() const
;
1)type型別要能夠作為函式的返回型別,不允許轉換成陣列或函式型別。 2)型別轉換運算子 既沒有顯式的返回型別,也沒有形參,而且必須定義為類的成員函式,一般不改變物件的內容,所以被定義成 const的。 3)型別轉換運算子是 隱式執行的,無法給這些函式傳遞實參。 4)定義 向bool型別轉換的現象比較普遍。比如IO型別就定義了向bool型別的顯示轉換。   3、顯式型別轉換explicit
explicit
operator int() const { return val;}

1)顯式轉換會遮蔽隱式轉化,要進行顯式的請求:static_cast<>()
2)有一個例外,當表示式被用作條件時,會進行自動轉化

whie(cin>>val){}
在這個例子中,首先執行輸入操作,然後返回cin,cin就被隱式的轉換為了bool型別。 3)operator bool一般被定義為explicit的。   4、避免二義性轉換