(轉載)C++ explicit 關鍵字詳解
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】C/C++
[
47 瀏覽
0 評論
12 贊
20 踩
]
概要
explicit 關鍵字只用於類內的單參數構造函數前面,用於避免隱式轉換。
正文
隱式轉換就像是這樣:
class MyClass { private: int n; public: MyClass(int i) { n = i; } }; int main() { // 隱式轉換示例 MyClass var = 10; return 0; }
顯式轉換就像是這樣:
class MyClass { private: int n; public: explicit MyClass(int i) // 這裏指定 explicit 關鍵字 { n = i; } }; int main() { // 顯式轉換示例 MyClass var(10); // 下面這句會導致編譯報錯,因爲指定了 explicit 關鍵字,無法再進行隱式轉換 //MyClass var = 10; return 0; }
explicit 關鍵字只用於類內的單參數構造函數前面,由於無參數的構造函數和多參數的構造函數總是顯式調用,因此在這些構造函數前面加 explicit 毫無意義。
Google 的 C++ 規範中提到 explicit 的優點是可以避免不合時宜的類型轉換,缺點無。所以 Google 規定所有的單參數構造函數都必須是顯示的,只有極少數情況下拷貝構造函數可以不聲明爲 explicit(例如作爲其他類的透明包裝器的類)。
Effctive C++ 中說:被聲明爲 explicit 的構造函數通常比其 non-explicit 兄弟更受歡迎,因爲它們禁止編譯器執行非預期(往往也不被期望)的類型轉換。除非我有一個好理由允許構造函數被用於隱式類型轉換,否則我會把它聲明爲 explicit。