C explicit 關鍵字解析

2021-06-01 06:46:44 字數 1309 閱讀 8143

**:

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...