c++提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉 換中使用。
c++中, 乙個引數的建構函式, 承擔了兩個角色。 1 是個構造器 2 是個預設且隱含的型別轉換操作符。
所以, 有時候在我們寫下如 aaa = ***, 這樣的**, 且恰好***的型別正好是aaa單引數構造器的引數型別, 這時候編譯器就自動呼叫這個構造器, 建立乙個aaa的物件。
這樣看起來好象很酷, 很方便。 但在某些情況下(見下面權威的例子), 卻違背了我們(程式設計師)的本意。 真是成也蕭何, 敗也蕭何。 這時候就要在這個構造器前面加上explicit修飾, 指定這個構造器只能被明確的呼叫,使用, 不能作為型別轉換操作符被隱含的使用。 呵呵, 看來還是光明正大些比較好。
關於這一點,《more effective c++》上也給出了詳細的解釋:
例如比較array物件,部分**如下:
bool operator==( const array& lhs,
const array& rhs);
arraya(10);
arrayb(10);
...for (int i = 0; i < 10; ++i)
if (a == b[i])
else
我們想用a的每個元素與b的每個元素相比較,但是當錄入a 時,我們偶然忘記了陣列下標。當然我們希望編譯器能報出各種各樣的警告資訊,但是它根本沒有。因為它把這個呼叫看成用array參 數(對於a)和int(對於b[i])引數呼叫operator==函式,然而沒有operator==函式是這樣的引數型別,我們的編譯器注意到它能通 過呼叫array建構函式能轉換int型別到array型別,這個建構函式只有乙個int型別的引數。然後 編譯器如此去編譯,生成的**就象這樣:
for (int i = 0; i < 10; ++i)
i f (a == static_cast< array>(b[i])) ....
容易的方法是利用乙個最新編譯器的特性,explicit關鍵字。為了解決隱式型別轉換而特別引入的這個特性,它的使用方法很好理解。建構函式用 explicit宣告,如果這樣做,編譯器會拒絕為了隱式型別轉換而呼叫建構函式。顯式型別轉換依然合法:
template
class array ;
arraya(10); // 正確, explicit 建構函式, 在建立物件時能正常使用
arrayb(10); // 也正確
if (a == b[i]) ... // 錯誤! 沒有辦法 隱式轉換int 到 array
由此看到explicit有些時候是非常有用的。
C explicit 關鍵字解析
c 提供了關鍵字explicit,可以阻止不應該允許的經過轉換建構函式進行的隱式轉換的發生。宣告為explicit的建構函式不能在隱式轉換中使用。c 中,乙個引數的建構函式,承擔了兩個角色。1 是個構造器 2 是個預設且隱含的型別轉換操作符。所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正...
C Explicit關鍵字詳細解析
知道c 中有explicit關鍵字,但對其用法和作用的理解有些模糊,今天有時間給系統的澄清一下 explicit關鍵字用來修飾類的建構函式,表明建構函式是顯示的,相對的是implicit關鍵字。首先這個關鍵字只能用在類內部的建構函式宣告上,而不能用在類外部的函式定義上,它的作用是不能進行隱式轉換。用...
C explicit關鍵字詳解
首先,c 中的explicit關鍵字只能用於修飾只有乙個引數的類建構函式,它的作用是表明該建構函式是顯示的,而非隱式的,跟它相對應的另乙個關鍵字是implicit,意思是隱藏的,類建構函式預設情況下即宣告為implicit 隱式 那麼顯示宣告的建構函式和隱式宣告的有什麼區別呢?我們來看下面的例子 c...