[C++] 過載運算子與型別轉換(2)——函式呼叫運算子和型別轉換運算子
阿新 • • 發佈:2018-12-26
1、這兩個應該是C++中比較高階的用法了。
一、函式呼叫運算子 1、過載函式呼叫運算子(),必須是成員函式,一個類可以定義多個不同版本的呼叫運算子,相互之間應該在引數數量或者型別上有所區別。 2、定義了呼叫運算子的類的物件稱作 函式物件;函式物件常常作為泛型演算法的實參。 3、 lambda表示式就是一個匿名的函式物件。lambda表示式產生的類不含有預設建構函式、賦值運算子及預設解構函式;它是否含有預設的拷貝/移動建構函式則通常要視捕獲的資料成員型別而定。 4、標準庫定義的函式物件 5、 C++語言中幾種可呼叫物件operator type() const1)type型別要能夠作為函式的返回型別,不允許轉換成陣列或函式型別。 2)型別轉換運算子 既沒有顯式的返回型別,也沒有形參,而且必須定義為類的成員函式,一般不改變物件的內容,所以被定義成 const的。 3)型別轉換運算子是 隱式執行的,無法給這些函式傳遞實參。 4)定義 向bool型別轉換的現象比較普遍。比如IO型別就定義了向bool型別的顯示轉換。 3、顯式型別轉換explicit;
explicitoperator int() const { return val;}
1)顯式轉換會遮蔽隱式轉化,要進行顯式的請求:static_cast<>()
2)有一個例外,當表示式被用作條件時,會進行自動轉化
whie(cin>>val){}在這個例子中,首先執行輸入操作,然後返回cin,cin就被隱式的轉換為了bool型別。 3)operator bool一般被定義為explicit的。 4、避免二義性轉換