天天看點

C++構造函數 explicit關鍵字不起作用的一次小坑記錄

歡迎通路我的個人部落格:原文連結

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)的接口;

繼續閱讀