c++過載型別轉換操作符(type cast operator)
boost::ref和boost::cref使用了過載「型別轉換(type cast)」操作符來實現使用引用型別來替換模版引數,本文就介紹一下這種操作符的過載方法。
函式原型
t1::operator t2() [const]; //t1的成員函式,過載"(t2)a"操作符
1. 型別轉換過載函式的返回值是隱含的,並且不能顯示宣告,返回值是與轉換的型別相同的,即為上面原型中的t2。
2. 不能有引數;
3. 支援繼承,可以為虛函式;
4. 支援使用typedef定義的型別;
先通過乙個簡單的例子來說明如何使用型別轉換過載
1 #include
2 3 class d
6 7 /* 過載「(int)d」 */
8 operator int() const
1213 private:
14 double d_;
15 };
1617 int add(int a, int b)
2021 int main()
2829
在24行執行add(d1,d2)函式時「(int)d」過載函式將被呼叫,程式執行的輸出為:
(int)d called!
(int)d called!
3 型別轉換操作符 vs 型別轉換建構函式(conversion constructor)
有時候使用conversion constructor就能實現型別轉換,這種方式效率更高而且也更直觀,下面舉例說明:
1 #include
2 3 class a
4 7 8 /* 過載"(int)a" */
9 operator int()
1011 private:
12 int dat;
13 };
1415
16 class x
17 20 21 /* 過載"(int)a" */
22 operator int()
2324 /* 過載"(a)a" */
25 operator a()
2930 private:
31 int dat;
32 };
3334
35 int main()
36 49
上面這個程式中x類通過過載「operator a()」來實現將x型別物件轉換成a型別,這種方式需要先建立乙個臨時a物件再用它去賦值目標物件;更好的方式是為a類增加乙個建構函式:
a(const x& rhs) : dat(rhs) {}
同時,請注意上面程式的第45行more的型別在呼叫std::cout時被隱式地轉成了int!
乙個簡單boost::ref實現
通過過載type cast operator,我們就可以自己實現乙個簡版的boost::ref。
1 #include
2 3 template
4 class refholder
5 8 9 /* 過載「(t&)a」操作符 */
10 operator t& () const
1314 private:
15 t& ref_;
16 };
1718
19 template
20 inline refholder byref(t& t)
2324 int inc(int& num)
2829
30 int main()
2023年計算機等級考試二級 輔導講義(1)
c 氣泡排序基本應用技巧分享 對於學過c語言的朋友來說,可能對於裡面的氣泡排序還是有很深印象的。那麼今天我們將會為大家介紹一下具有c語言特性的c 語言中氣泡排序的實現方法。接下來就讓我們一起來看看c 氣泡排序的具體操作方法吧。c 氣泡排序 示例 include iostream.h include ...
2023年計算機等級考試二級Access練習5
一 選擇題 在下列各題的a b c d 四個選項中,只有乙個選項是正確的,請將正確的選項塗寫在答題卡相應位置上,答在試卷上不得分。1 假設線性表的長度為n,則在最壞情況下,氣泡排序需要的比較次數為 a log2n b n2 c o n1.5 d n n 1 2 2 演算法分析的目的是 a 找出資料結...
2023年計算機等級考試二級Access練習7
19 下列不屬於查詢檢視的是 a 設計檢視 b 模板檢視 c 資料表檢視 d sql檢視 20 對查詢能實現的功能敘述正確的是 a 選擇字段,選擇記錄,編輯記錄,實現計算,建立新錶,建立資料庫 b 選擇字段,選擇記錄,編輯記錄,實現計算,建立新錶,更新關係 c 選擇字段,選擇記錄,編輯記錄,實現計算...