zoukankan      html  css  js  c++  java
  • 【C++基础 06】explict关键字

    C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为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型,则隐式调用构造函数时生成的临时对象也无法传入。


  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/fzll/p/3954583.html
Copyright © 2011-2022 走看看