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)的接口;
作者: Wcctml
个人网站: Wcctml
出处: http://www.cnblogs.com/wcctml/>
本文版权归原作者所有,欢迎转载,但未经作者同意必须保留此段声明;
且在文章页面明显位置给出
原文链接;
如有问题,可发送邮件咨询。