explicit用來防止由建構函式定義的隱式轉換。
要明白它的作用,首先要了解隱式轉換:可以用單個實參來呼叫的建構函式定義了從形參型別到該類型別的乙個隱式轉換。
例如:
class
things
intcompareto
(const things & other)
; std:
:string m_name;
int height;
int weight;
};
這裡things的建構函式可以只用乙個實參完成初始化。所以可以進行乙個隱式轉換,像下面這樣:
things a;..
....
....
....
..//在這裡被初始化並使用。
std::string nm =
"book_1"
;//由於可以隱式轉換,所以可以下面這樣使用
int result = a.
compareto
(nm)
;
這段程式使用乙個string型別物件作為實參傳給things的compareto函式。這個函式本來是需要乙個tings物件作為實參。現在編譯器使用string nm來構造並初始化乙個
things物件,新生成的臨時的things物件被傳遞給compareto函式,並在離開這段函式後被析構。
這種行為的正確與否取決於業務需要。假如你只是想測試一下a的重量與10的大小之比,這麼做也許是方便的。但是假如在compareto函式中還涉及到了要除以初始化為0的height屬性,那麼這麼做可能就是錯誤的。你可能需要在構造tings之後更改height屬性不為0。所以要限制這種隱式型別轉換。
那麼這時候就可以通過將建構函式宣告為explicit,來防止隱式型別轉換。
explicit關鍵字只能用於類內部的建構函式宣告上,而不能用在類外部的函式定義上。現在things類像這樣:
class
things
intcompareto
(const things & other)
; std:
:string m_name;
int height;
int weight;
};
這時你仍然可以通過顯式使用建構函式完成上面的型別轉換:
things a;..
....
....
....
..//在這裡被初始化並使用。
std::string nm =
"book_1"
;//顯示使用建構函式
int result = a.
compareto
(things
(nm)
);
google的c++規範中提到explicit的優點是可以避免不合時宜的型別變換,缺點無。所以google約定所有單引數的建構函式都必須是顯式構造的,只有極少數情況下拷貝建構函式可以不宣告成explicit。例如作為其他類的透明包裝器的類。
effective c++中說:被宣告為explicit的建構函式通常比其non-explicit兄弟更受歡迎。因為它們禁止編譯器執行非預期(往往也不被期望)的型別轉換。除非我有乙個好理由允許建構函式被用於隱式型別轉換,否則我會把它宣告為explicit。我鼓勵你遵循相同的政策。
c 中explicit關鍵字
c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的。既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?按照預設規定,只有乙個引數的建構函式也定義了乙個隱式轉換,將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 include using namesp...
c 中的explicit關鍵字
c 中的explicit關鍵字 c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下...
c 中的explicit關鍵字
c 中的explicit關鍵字用來修飾類的建構函式,表明該建構函式是顯式的,既然有 顯式 那麼必然就有 隱式 那麼什麼是顯示而什麼又是隱式的呢?如果c 類的建構函式有乙個引數,那麼在編譯的時候就會有乙個預設的轉換操作 將該建構函式對應資料型別的資料轉換為該類物件,如下面所示 class myclas...