菜单
  

    explicit用来防止由构造函数定义的隐式转换。要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换。

    例如:

    class things

    {

        public:

            things(const std::string&name =""):

                  m_name(name),height(0),weight(10){}

            int CompareTo(const things & other);

            std::string m_name;

            int height;

            int weight;

    };

    这里things的构造函数可以只用一个实参完成初始化。所以可以进行一个隐式转换,像下面这样:

    things a;

    ................//在这里被初始化并使用。

    std::string nm ="book_1";

    //由于可以隐式转换,所以可以下面这样使用

    int result = a.CompareTo(nm);

      这段程序使用一个string类型对象作为实参传给things的CompareTo函数。这个函数本来是需要一个tings对象作为实参。现在编译器使用string nm来构造并初始化一个

     

     things对象,新生成的临时的things对象被传递给CompareTo函数,并在离开这段函数后被析构。

     这种行为的正确与否取决于业务需要。假如你只是想测试一下a的重量与10的大小之比,这么做也许是方便的。但是假如在CompareTo函数中还涉及到了要除以初始化为0的height属性,那么这么做可能就是错误的。你可能需要在构造tings之后更改height属性不为0。所以要限制这种隐式类型转换。

      那么这时候就可以通过将构造函数声明为explicit,来防止隐式类型转换。

      explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义上。现在things类像这样:

     

    class things

    {

        public:

            explicit things(const std::string&name =""):

                  m_name(name),height(0),weight(0){}

            int CompareTo(const things & other);

            std::string m_name;

            int height;

            int weight;

    };

      这时再进行编译,在vs2008上会提示:没有可用于执行该转换的用户定义的转换运算符,或者无法调用该运算符。

      这时你仍然可以通过显式使用构造函数完成上面的类型转换:

    things a;

    ................//在这里被初始化并使用。

    std::string nm ="book_1";

    //显示使用构造函数

    int result = a.CompareTo(things(nm));

      google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显式构造的,只有极少数情况下拷贝构造函数可以不声明成explicit。例如作为其他类的透明包装器的类。论文网

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

  1. 上一篇:permission denied解决方法没有权限
  2. 下一篇:@Deprecated注解功能用法不建议使用废弃的
  1. 礼物在农民生活中的意义访谈提纲

  2. 教师语言在教学中的作用问卷调查

  3. 城市化建设中的农村居民...

  4. 小组合作学习在小学语文...

  5. 在线教学中的学习支架专家评价表

  6. 小学生心目中的班主任问卷调查表

  7. 调控策略对在教师实习教...

  8. 小学课堂教学效率国内外研究现状和参考文献

  9. Bootstrap的OpenGL人体模型仿真

  10. 多智能体系统一致性问题研究

  11. 友谊质量调查问卷表

  12. PLC焊机电气控制系统设计开题报告

  13. 跨国企业全球营销策略的市场定位调查

  14. 上市公司债务税盾文献综述和参考文献

  15. 淮安乐天玛特连锁超市4P营销策略分析

  16. PLC启闭机液压系统设计及其故障诊断

  17. MATLAB动车组列车牵引变流...

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回