2023年計算機等級考試二級 輔導講義(8)

2022-09-22 21:57:19 字數 1779 閱讀 3000

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 選擇字段,選擇記錄,編輯記錄,實現計算...