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)的接口;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值