C++11顯示類型轉(zhuǎn)換的優(yōu)點
1.隱式類型轉(zhuǎn)換的問題
隱式類型轉(zhuǎn)換是C++一個讓人又愛又恨的特性,使用方便,但可能會降低代碼可讀性,甚至?xí)斐梢恍┦蛛[晦的錯誤。
#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;
}
//加運算符重載
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對象相加的結(jié)果并不是我們期望的數(shù)值3,而是1,導(dǎo)致這種隱晦錯誤的原因是在兩個MyInt對象相加后,結(jié)果對象myInt1被隱式地轉(zhuǎn)換為bool類型,導(dǎo)致輸出數(shù)值為1。隨著項目代碼規(guī)模變大,這種由隱式類型轉(zhuǎn)換導(dǎo)致的隱晦錯誤會越埋越深,越來越難以發(fā)現(xiàn)。
2.顯示類型轉(zhuǎn)換
為了阻止容易導(dǎo)致隱晦錯誤的隱式類型轉(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; //編譯出錯
當(dāng)使用explicit關(guān)鍵字修飾bool類型轉(zhuǎn)換操作符時,隱式類型轉(zhuǎn)換將會被阻止,進(jìn)而引起上面的編譯錯誤,將潛在的隱晦錯誤暴露于編譯階段,讓錯誤得以提前發(fā)現(xiàn),提前解決。
注意,顯式類型轉(zhuǎn)換有一個例外。如果表達(dá)式被用作條件,僅限轉(zhuǎn)換到bool,那么顯式的operator bool()也可以隱式地進(jìn)行。“被用作條件”指出現(xiàn)在以下語句:
(1)if、while及do語句的條件部分;
(2)for語句頭的條件表達(dá)式;
(3)邏輯非運算符(!)、邏輯或運算符(||)、邏輯與運算符(&&)的運算對象;
(4)條件運算符(x ? y : z)的條件表達(dá)式。
由于轉(zhuǎn)換到bool一般被用作條件,所以operator bool()一般用explicit來修飾。
以上就是C++11顯示類型轉(zhuǎn)換的優(yōu)點的詳細(xì)內(nèi)容,更多關(guān)于C++11顯示類型轉(zhuǎn)換的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++ CryptoPP使用AES實現(xiàn)加解密詳解
Crypto++ (CryptoPP) 是一個用于密碼學(xué)和加密的 C++ 庫,提供了大量的密碼學(xué)算法和功能,這篇文章主要為大家介紹了C++ CryptoPP如何使用AES實現(xiàn)加解密,需要的可以參考下2023-11-11
解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄
在使用OpenCV的cv::VideoCapture讀取視頻文件時,可能會遇到無法讀取特定格式,如MP4的視頻文件的問題,本文介紹解決C++ openCV無法讀取視頻但是可以讀取圖像的問題記錄,感興趣的朋友跟隨小編一起看看吧2024-09-09
詳解C語言中sizeof如何在自定義函數(shù)中正常工作
在main函數(shù)中,sizeof是可以正常工作的,但是在自定義函數(shù)中就不可以了。所以本文將為大家詳細(xì)講解一下如何解決這一問題,感興趣的可以了解一下2022-05-05

