C 核心準則邊譯邊學 X 5 盡量不使用型別轉換

2021-09-29 21:48:32 字數 1415 閱讀 7100

按照c++核心準則的說法,應該儘量減少型別轉換的使用,如果必須使用則使用narrow_cast和narrow。以下分幾種情況討論這個問題。

本來就不應該使用的情況:

觀察如下**:

class baseclassvirtual void vfun()};class subclass : public baseclass};
subclass是baseclass的派生類,可以說subclass就是baseclass,因此subclass型別的指標向base型別指標賦值的時候就不需要轉換。

baseclass* bc = new subclass();bc->bfun();bc->vfun();
使用模板可以解決的情況:

觀察下面的**:

int mul(int a, int b)int main()
**中定義了乙個整形數字的乘法函式,如果實參是整數的話函式可以正常執行;如果實參是浮點數,一方面編譯會產生警告,另一方面計算會丟失精度(和警告的結果一致)。對實參進行型別轉換雖然可以解決警告資訊但是但是卻無法解決丟失精度的問題。這時較好的的解決方式是使用模板:

templateauto mul(t1 a, t2 b) ->decltype(a*b)
**中使用了c++11新特性模板函式返回型別後置技術實現了更大的靈活性(兩個實參可以是不同型別)。

int main()
無論哪種情況都不會出現編譯警告,都可以得到正確的結果。

使用narrow_cast和narrow

如果設計者處於某種目的就是希望進行窄化型別轉換時可以使用gsl提供的narrow_cast進行明確地表達這層意思。

cout << mul(narrow_cast(3.4), narrow_cast(2.8)) << endl;
如果希望進行型別轉換,但是不希望發生窄化的情況下,可以使用narrow型別轉換:

cout << mul(narrow(3), narrow(8)) << endl;cout << mul(narrow(3.4), narrow(2.8)) << endl;
第一種情況沒有發生窄化,因此可以正常執行;第二種情況發生的浮點數到整數的窄化,會觸發異常。

C 核心準則邊譯邊學 P 13 酌情使用支援庫

reason 原因 使用經過良好設計,良好文件化,良好支援的功能庫既可以省時,又可以省力。即使你花費主要精力去實現某項功能,支援庫的品質和文件還是有很大的可能性會會比你做的好。支援庫的成本 時間,勞力,費用等 可以被很多使用者分擔。乙個廣泛使用的支援庫比單獨的應用更有可能保持最新狀態並且使用到新系統...

C 核心準則邊譯邊學 F 8 優先選擇純函式

譯者注 純函式是指符合下面兩個特點的函式 同樣的輸入一定產生同樣的輸出。但是並不要求所有的資料都一定引數計算輸出值。不會產生 除了可見的輸出之外,不會產生額外的輸出。這裡額外的輸出可以是i o操作,呼叫額外介面,傳送通訊資料等。reason 原因 pure functions are easier ...

coding邊學邊記之C

1.c 中定義函式要有析構函式 2.c 中自定義標頭檔案需要 ifndef code cpp global h define code cpp global h endif code cpp global h3.c 中的map插入鍵值對時,一定要先檢查鍵是否存在,因為 a.如果插入相同鍵的操作,無論...