explicit用來防止由構(gòu)造函數(shù)定義的隱式轉(zhuǎn)換,。
要明白它的作用,首先要了解隱式轉(zhuǎn)換:可以用單個實參來調(diào)用的構(gòu)造函數(shù)定義了從形參類型到該類類型的一個隱式轉(zhuǎn)換,。 例如:
class things
這里things的構(gòu)造函數(shù)可以只用一個實參完成初始化,。所以可以進行一個隱式轉(zhuǎn)換,像下面這樣: things a; 這段程序使用一個string類型對象作為實參傳給things的CompareTo函數(shù)。這個函數(shù)本來是需要一個tings對象作為實參?,F(xiàn)在編譯器使用string nm來構(gòu)造并初始化一個 things對象,,新生成的臨時的things對象被傳遞給CompareTo函數(shù),并在離開這段函數(shù)后被析構(gòu),。
這種行為的正確與否取決于業(yè)務(wù)需要,。假如你只是想測試一下a的重量與10的大小之比,這么做也許是方便的,。但是假如在CompareTo函數(shù)中還涉及到了要除以初始化為0的height屬性,,那么這么做可能就是錯誤的。需要在構(gòu)造tings之后更改height屬性不為0,。所以要限制這種隱式類型轉(zhuǎn)換,。 那么這時候就可以通過將構(gòu)造函數(shù)聲明為explicit,來防止隱式類型轉(zhuǎn)換,。 explicit關(guān)鍵字只能用于類內(nèi)部的構(gòu)造函數(shù)聲明上,,而不能用在類外部的函數(shù)定義上。現(xiàn)在things類像這樣: class things 這時再進行編譯,,在vs2008上會提示:沒有可用于執(zhí)行該轉(zhuǎn)換的用戶定義的轉(zhuǎn)換運算符,,或者無法調(diào)用該運算符。 這時你仍然可以通過顯示使用構(gòu)造函數(shù)完成上面的類型轉(zhuǎn)換: things a; google的c++規(guī)范中提到explicit的優(yōu)點是可以避免不合時宜的類型變換,,缺點無。所以google約定所有單參數(shù)的構(gòu)造函數(shù)都必須是顯示的,,只有極少數(shù)情況下拷貝構(gòu)造函數(shù)可以不聲明稱explicit,。例如作為其他類的透明包裝器的類。
effective c++中說:被聲明為explicit的構(gòu)造函數(shù)通常比其non-explicit兄弟更受歡迎,。因為它們禁止編譯器執(zhí)行非預(yù)期(往往也不被期望)的類型轉(zhuǎn)換,。除非我有一個好理由允許構(gòu)造函數(shù)被用于隱式類型轉(zhuǎn)換,否則我會把它聲明為explicit。我鼓勵你遵循相同的政策,。 轉(zhuǎn)載請注明出處,。
|
|