溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++11顯示類型轉(zhuǎn)換有哪些優(yōu)點(diǎn)

發(fā)布時(shí)間:2020-08-13 16:04:19 來源:億速云 閱讀:194 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹C++11顯示類型轉(zhuǎn)換有哪些優(yōu)點(diǎn),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

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)在以下語句:

 (1)if、while及do語句的條件部分;
 (2)for語句頭的條件表達(dá)式;
 (3)邏輯非運(yùn)算符(!)、邏輯或運(yùn)算符(||)、邏輯與運(yùn)算符(&&)的運(yùn)算對(duì)象;
 (4)條件運(yùn)算符(x &#63; y : z)的條件表達(dá)式。

由于轉(zhuǎn)換到bool一般被用作條件,所以operator bool()一般用explicit來修飾。

以上是C++11顯示類型轉(zhuǎn)換有哪些優(yōu)點(diǎn)的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI