explicit构造函数和private

某天写一个用特定数据类型才能构造的类,就习惯性的声明了一个默认的构造函数,并声明为了private,避免勿调用默认的构造函数去声明这个类。但是却收到领导的一封邮件,建议用explicit去申明就行了,不建议用private.

处于懒惰的习惯,我回了一个ok,今天无意中看到邮件了,发现不对,靠

还是用代码说话吧:

class myStr
{
protected:
    char* str_;
    
public:
    myStr(void)                       // 默认的构造函数,什么也不做
    : str_(nullptr)
    {}
    
    myStr(int i)                       //带int类型构造函数,什么也不做
    : str_(nullptr)
{}
}

不管我是调用    myStr s = 'A';还是调用    myStr s = 1;都会去调用到myStr(int i)这个构造函数,默认的做了类型转.特别是这种看上去还合理的转换,换个离谱点的myStr s = “test”,还是可以编译,也最多只是收到一个警告:Multi-character character constant,也许某些编译上不允许,或者把警告等级打高了会报错,但是这都不是我想要的转换,c++就是这样充满了各种坑的语言,

如果加上explicit,表示不允许编译器做这种转换。

 

总结来说就是所有单参数的构造函数都应该声明explicit,避免编译器做各种明明奇妙的类型转换。

 

引用effective c++:被声明为explicit的构造函数通常比其non-explicit兄弟更受欢迎。因为它们禁止编译器执行非预期(往往也不被期望)的类型转换。除非我有一个好理由允许构造函数被用于隐式类型转换,否则我会把它声明为explicit。我鼓励你遵循相同的政策。

 

把默认构造函数申明为private,我认为很简单,就是要么是单例,要么就是希望只调用我提供的构造函数来声明对象。

大多数时候,我觉得更好的做法就是将拷贝构造函数和operator=(赋值操作符重载)声明成private。

禁止一个类的外部用户对这个类的对象进行复制动作,有需要的时候再去打开这些。

 

为什么编译器就不能提供一个默认安全封闭的类呢,当我们需要的时候再去申请各种特性。不要把类的安全都交给不靠谱的码农,大多数时候我们自己写代码的时候也不清楚自己代码的危险性。c++太相信码农了,其实大部分码农都是极度不靠谱的。

posted @ 2014-07-22 20:42  憶秋年  阅读(782)  评论(0编辑  收藏  举报