菜单
  

    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. 街头游园设计

  10. 身体自尊量表(PSPP)

  11. 从何红舟《桥上的风景》中感受油画构成美

  12. 甲硫醇钠生产工艺设计任务书

  13. 玫瑰精油特征香气成分研究

  14. 多级反馈队列调度算法的研究+源代码

  15. 货币国际化国内外研究现状

  16. 进出口贸易与经济增长文献综述和参考文献

  17. Toeplitz定理及其应用+文献综述

  

About

优尔论文网手机版...

主页:http://www.youerw.com

关闭返回