91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++為什么盡量不使用類型轉換

發布時間:2021-11-24 11:16:56 來源:億速云 閱讀:166 作者:iii 欄目:大數據

這篇文章主要介紹“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++為什么盡量不使用類型轉換”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

保靖县| 温州市| 望都县| 会同县| 布拖县| 武义县| 黔东| 昭通市| 屏南县| 东乡族自治县| 江源县| 那曲县| 和平县| 富川| 巴彦县| 珠海市| 乐亭县| 沂水县| 兴安县| 瓮安县| 隆林| 岚皋县| 永济市| 吉林市| 长宁区| 太仆寺旗| 乌兰浩特市| 北安市| 铜川市| 龙州县| 永安市| 霸州市| 喀什市| 桂阳县| 通河县| 沧源| 蒙阴县| 乌恰县| 龙海市| 洪雅县| 保定市|