您好,登錄后才能下訂單哦!
這篇文章主要介紹C++11顯示類型轉換有哪些優點,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
1.隱式類型轉換的問題
隱式類型轉換是C++一個讓人又愛又恨的特性,使用方便,但可能會降低代碼可讀性,甚至會造成一些十分隱晦的錯誤。
#include <iostream> using namespace std; class MyInt { public: //單參構造函數 explicit MyInt(int value) :_value(value) {} //類型轉換操作符 operator bool() const noexcept { return _value != 0; } //加運算符重載 MyInt& operator+(const MyInt& right) { _value += right.getValue(); return *this; } int getValue() const { return _value; } private: int _value; }; int main() { MyInt myInt1(1); MyInt myInt2(2); cout << "myInt1+myInt2=" << myInt1 + myInt2 << endl; return 0; }
程序編譯運行輸出:
myInt1+myInt2=1
雖然程序編譯運行沒有什么問題,但是兩個MyInt對象相加的結果并不是我們期望的數值3,而是1,導致這種隱晦錯誤的原因是在兩個MyInt對象相加后,結果對象myInt1被隱式地轉換為bool類型,導致輸出數值為1。隨著項目代碼規模變大,這種由隱式類型轉換導致的隱晦錯誤會越埋越深,越來越難以發現。
2.顯示類型轉換
為了阻止容易導致隱晦錯誤的隱式類型轉換,C++11引入了explicit關鍵字作用于自定義的類型轉換操作符的功能,禁止隱式類型轉換。其用法類似于explicit作用于單參構造函數來避免單參數構造函數被隱式調用造成的隱式類型轉換。
//類型轉換操作符 explicit operator bool() const noexcept { return _value != 0; } cout << "myInt1+myInt2=" << myInt1 + myInt2 << endl; //編譯出錯
當使用explicit關鍵字修飾bool類型轉換操作符時,隱式類型轉換將會被阻止,進而引起上面的編譯錯誤,將潛在的隱晦錯誤暴露于編譯階段,讓錯誤得以提前發現,提前解決。
注意,顯式類型轉換有一個例外。如果表達式被用作條件,僅限轉換到bool,那么顯式的operator bool()也可以隱式地進行。“被用作條件”指出現在以下語句:
(1)if、while及do語句的條件部分;
(2)for語句頭的條件表達式;
(3)邏輯非運算符(!)、邏輯或運算符(||)、邏輯與運算符(&&)的運算對象;
(4)條件運算符(x ? y : z)的條件表達式。
由于轉換到bool一般被用作條件,所以operator bool()一般用explicit來修飾。
以上是C++11顯示類型轉換有哪些優點的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。