• 【C++基金会 06】explictkeyword


    C++提供keywordexplicit,你应该不能阻止的转换构造隐式转换发生的同意。声明explicit的构造不能在一个隐式转换使用。

    1.演示样例

    我们先来看一段演示样例代码:

    class A
    {
    public:
      A(int v):var(v){};//带一个int型值的构造函数
      bool isSame(const A& ref) const {return var == ref.var;}//判等函数
    private:
      int var;//成员变量var
    };
    
    void main()
    {
      A a(5);//构造a对象
      A b(5);//构造b对象
      if (a.isSame(b))
        cout<<"a==b"<<endl;
      else
        cout<<"a!=b"<<endl;
    }

    上述代码获得结果是a==b。假设A b(3),获得的结果就是a!=b。

    2.构造函数定义引起的隐式转换

    因为构造函数须要传入一个int型初始值,因此能够觉得这是一个隐式转换。把一个int型值转换为一个A类型的对象。

    所以假设改动main函数为例如以下代码。

    class A
    {
    public:
      A(int v):var(v){};//带一个int型值的构造函数
      bool isSame(const A& ref) const {return var==ref.var;}//判等函数
    private:
      int var;//成员变量var
    };
    
    void main()
    {
      A a(5);//构造a对象
      if (a.isSame(5))//这里会由于构造函数的隐式转换。因而正确运行isSame 
        cout<<"a==b"<<endl;
      else
        cout<<"a!=b"<<endl;
    }
    这看起来不错,好像还省了不少力气。可是这种使用依赖于用户是否有对应的需求,有时候它将成为一个bug。所以更好的办法是抑制这种由构造函数引起的隐式转换。

    3.抑制抑制由构造函数定义的隐式转换

    在构造函数中引入explicit能够帮我们解决问题。


    class A
    {
    public:
      explicit A(int v):var(v){};//带一个int型值的构造函数
      bool isSame(const A& ref) const {return var==ref.var;}//判等函数
    private:
      int var;//成员变量var
    };
    
    void main()
    {
      A a(5);//构造a对象
      if (a.isSame(5))
        cout<<"a==b"<<endl;
      else
        cout<<"a!=b"<<endl;
    }
    //输出结果
    error C2664: “A::isSame”: 不能将參数 1 从“int”转换为“const A &”  
    1>        原因例如以下: 无法从“int”转换为“const A”  
    1>   
    这样一来构造函数就无法进行隐式转换,

    4.为转换进行显式使用构造函数

    这时候仍想进行转换的话。显式使用构造函数吧。

    class A
    {
    public:
      explicit A(int v):var(v){};//带一个int型值的构造函数
      bool isSame(const A& ref) const {return var==ref.var;}//判等函数
    private:
      int var;//成员变量var
    };
    
    void main()
    {
      A a(5);//构造a对象
      if (a.isSame(A(5))//显示使用构造函数
        cout<<"a==b"<<endl;
      else
        cout<<"a!=b"<<endl;
    }

    5.总结

    除非有明显的理由想利用构造函数定义的隐式转换。否则设置explicit能够避免一些错误,当须要进行转换的时候,由用户显式地调用构造函数。当然C++的暂时对象都是const,假设isSame函參不是const型。则隐式调用构造函数时生成的瞬态对象不能传递。


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    eclipse中设置自动生成的author,date等注释
    【转】科大校长给数学系学弟学妹的忠告&本科数学参考书
    Eclipse的properties文件中文乱码解决方法
    log4j快速入门
    启动tomcat出现Removing obsolete files from server... Could not clean server of obsolete ……错误
    eclipse构建及运行maven web项目
    Eclipse+Maven创建webapp项目
    linux中通过lsof恢复删除的文件,前题是fd被占用。
    IP工具类-自己动手做个ip解析器
    第4章 集合类
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4801598.html
Copyright © 2020-2023  润新知