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(1); //调用成功被隐式转换为了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)的接口;
posted @ 2017-11-05 00:23  wcctml  阅读(295)  评论(0编辑  收藏  举报