歡迎通路我的個人部落格:原文連結
C++中的explicit關鍵字隻能用于修飾隻有一個參數的類構造函數,它的作用是表明該構造函數是顯示的, 而非隐式的, 跟它相對應的另一個關鍵字是implicit, 意思是隐藏的, 類構造函數預設情況下即聲明為implicit(隐式)。
class CGay
{
public:
explicit CGay(bool bShow = false, const string strName = "");
~CGay();
private:
bool m_bShow;
string m_strName;
};
CGay::CGay(bool bShow, const string strName)
{
m_bShow = bShow;
m_strName = strName;
}
CGay::~CGay()
{
}
const string GAY = "GAY";
CGay aGay(GAY); //調用失敗
CGay aGay("Gay1"); //調用成功被隐式轉換為了CGay(true,"");
CGay aGay(); //調用成功被隐式轉換為了CGay(true,"");
如果之前的構造函數是CGay(const string strName = “”),并且已經有幾個地方被使用過了。
調用是這樣:
CGay aGay("Gay1");
CGay aGay("Gay2");
然後又增加了一個新的預設參數改成
CGay(bool bShow = false, const string strName = "");
之前寫的Gay1、Gay2都不會有任何報錯提示。合法的。這樣就很坑了。
- 增加一個參數的時候,從後面增加;
- 不要在構造函數裡寫這種幺蛾子,增加一個void SetShow(bool bShow)的接口;