類若有單參數構造函數,編譯器會執行隱式轉換:
class Str {
public:
Str(int n); // 構建長度 n 的空間
Str(const char* p); // 構建字符串副本
};
Str a = 10; // 隱式調用 Str(10)
Str b = "abcd"; // 隱式調用 Str("abcd")
Str f = 'f'; // 字符 'f' 提升為 int,調用 Str(102) —— 違背設計初衷
class Str {
public:
explicit Str(int n);
explicit Str(const char* p);
};
// 現在只能顯式構造
Str c(12);
Str d = Str(20);
Str *z = new Str(21);
// Str a = 10; // 編譯錯誤
// Str b = "abcd"; // 編譯錯誤
explicit。良習:除非有明確理由需要隱式轉換,否則單參數構造函數應加 explicit。