您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++為什么盡量不使用類型轉換”,在日常操作中,相信很多人在C++為什么盡量不使用類型轉換問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++為什么盡量不使用類型轉換”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
按照C++核心準則的說法,應該盡量減少類型轉換的使用,如果必須使用則使用narrow_cast和narrow。以下分幾種情況討論這個問題。
本來就不應該使用的情況:
觀察如下代碼:
class BaseClass{public: void bfun(){ cout << "BaseClass::bfun()" << endl; } virtual void vfun() { cout << "BaseClass::vfun()" << endl; }};class SubClass : public BaseClass{public: virtual void vfun() { cout << "SubClass::vfun()" << endl; }};
SubClass是BaseClass的派生類,可以說SubClass就是BaseClass,因此SubClass類型的指針向Base類型指針賦值的時候就不需要轉換。
BaseClass* bc = new SubClass();bc->bfun();bc->vfun();
使用模板可以解決的情況:
觀察下面的代碼:
int mul(int a, int b) {
return a * b;
}
int main()
{
cout << mul(3, 5) << endl;
cout << mul(2.7, 5.6) << endl;
return 0;
}
代碼中定義了一個整形數字的乘法函數,如果實參是整數的話函數可以正常執行;如果實參是浮點數,一方面編譯會產生警告,另一方面計算會丟失精度(和警告的結果一致)。對實參進行類型轉換雖然可以解決警告信息但是但是卻無法解決丟失精度的問題。這時較好的的解決方式是使用模板:
template<typename T1, typename T2>auto mul(T1 a, T2 b) ->decltype(a*b){ return a * b;}
代碼中使用了C++11新特性模板函數返回類型后置技術實現了更大的靈活性(兩個實參可以是不同類型)。
int main(){ cout << mul(3, 5) << endl; cout << mul(2.7, 5.6) << endl; cout << mul(2.7, 5) << endl; return 0;}
無論哪種情況都不會出現編譯警告,都可以得到正確的結果。
使用narrow_cast和narrow
如果設計者處于某種目的就是希望進行窄化類型轉換時可以使用gsl提供的narrow_cast進行明確地表達這層意思。
cout << mul(narrow_cast<int>(3.4), narrow_cast<int>(2.8)) << endl;
如果希望進行類型轉換,但是不希望發生窄化的情況下,可以使用narrow類型轉換:
cout << mul(narrow<int>(3), narrow<int>(8)) << endl;cout << mul(narrow<int>(3.4), narrow<int>(2.8)) << endl;
第一種情況沒有發生窄化,因此可以正常執行;第二種情況發生的浮點數到整數的窄化,會觸發異常。
到此,關于“C++為什么盡量不使用類型轉換”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。