C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)
1.隱式類型轉(zhuǎn)換的問題
隱式類型轉(zhuǎn)換是C++一個(gè)讓人又愛又恨的特性,使用方便,但可能會(huì)降低代碼可讀性,甚至?xí)斐梢恍┦蛛[晦的錯(cuò)誤。
#include <iostream> using namespace std; class MyInt { public: //單參構(gòu)造函數(shù) explicit MyInt(int value) :_value(value) {} //類型轉(zhuǎn)換操作符 operator bool() const noexcept { return _value != 0; } //加運(yùn)算符重載 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; }
程序編譯運(yùn)行輸出:
myInt1+myInt2=1
雖然程序編譯運(yùn)行沒有什么問題,但是兩個(gè)MyInt對(duì)象相加的結(jié)果并不是我們期望的數(shù)值3,而是1,導(dǎo)致這種隱晦錯(cuò)誤的原因是在兩個(gè)MyInt對(duì)象相加后,結(jié)果對(duì)象myInt1被隱式地轉(zhuǎn)換為bool類型,導(dǎo)致輸出數(shù)值為1。隨著項(xiàng)目代碼規(guī)模變大,這種由隱式類型轉(zhuǎn)換導(dǎo)致的隱晦錯(cuò)誤會(huì)越埋越深,越來越難以發(fā)現(xiàn)。
2.顯示類型轉(zhuǎn)換
為了阻止容易導(dǎo)致隱晦錯(cuò)誤的隱式類型轉(zhuǎn)換,C++11引入了explicit關(guān)鍵字作用于自定義的類型轉(zhuǎn)換操作符的功能,禁止隱式類型轉(zhuǎn)換。其用法類似于explicit作用于單參構(gòu)造函數(shù)來避免單參數(shù)構(gòu)造函數(shù)被隱式調(diào)用造成的隱式類型轉(zhuǎn)換。
//類型轉(zhuǎn)換操作符 explicit operator bool() const noexcept { return _value != 0; } cout << "myInt1+myInt2=" << myInt1 + myInt2 << endl; //編譯出錯(cuò)
當(dāng)使用explicit關(guān)鍵字修飾bool類型轉(zhuǎn)換操作符時(shí),隱式類型轉(zhuǎn)換將會(huì)被阻止,進(jìn)而引起上面的編譯錯(cuò)誤,將潛在的隱晦錯(cuò)誤暴露于編譯階段,讓錯(cuò)誤得以提前發(fā)現(xiàn),提前解決。
注意,顯式類型轉(zhuǎn)換有一個(gè)例外。如果表達(dá)式被用作條件,僅限轉(zhuǎn)換到bool,那么顯式的operator bool()也可以隱式地進(jìn)行?!氨挥米鳁l件”指出現(xiàn)在以下語(yǔ)句:
(1)if、while及do語(yǔ)句的條件部分;
(2)for語(yǔ)句頭的條件表達(dá)式;
(3)邏輯非運(yùn)算符(!)、邏輯或運(yùn)算符(||)、邏輯與運(yùn)算符(&&)的運(yùn)算對(duì)象;
(4)條件運(yùn)算符(x ? y : z)的條件表達(dá)式。
由于轉(zhuǎn)換到bool一般被用作條件,所以operator bool()一般用explicit來修飾。
以上就是C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)的詳細(xì)內(nèi)容,更多關(guān)于C++11顯示類型轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
OpenCV實(shí)現(xiàn)繞圖片中任意角度旋轉(zhuǎn)任意角度
這篇文章主要為大家詳細(xì)介紹了在圖片不被裁剪時(shí),opencv如何實(shí)現(xiàn)繞圖片中任意點(diǎn)旋轉(zhuǎn)任意角度,文中的示例代碼講解詳細(xì),需要的可以參考一下2022-09-09C語(yǔ)言 strcpy和memcpy區(qū)別詳細(xì)介紹
這篇文章主要介紹了C語(yǔ)言 strcpy和memcpy區(qū)別詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2017-01-01淺談C++/C關(guān)于#define的那些奇奇怪怪的用法
本文主要介紹了C++/C關(guān)于#define的那些奇奇怪怪的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07c語(yǔ)言分離三位數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了c語(yǔ)言分離三位數(shù)的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06詳解C語(yǔ)言中freopen()函數(shù)和fclose()函數(shù)的用法
這篇文章主要介紹了詳解C語(yǔ)言中freopen()函數(shù)和fclose()函數(shù)的用法,是C語(yǔ)言入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08通過C++程序示例理解設(shè)計(jì)模式中的外觀模式
這篇文章主要介紹了通過設(shè)計(jì)模式中的外觀模式及相關(guān)的C++程序示例,外觀模式在高層提供了一個(gè)統(tǒng)一的接口實(shí)現(xiàn)一定程度上的解耦,需要的朋友可以參考下2016-03-03