• C++基础:C++中的explicit关键字


        C++中,explicit用来修饰类的构造函数,表明该构造函数是显式的,不能发生隐式类型转换(implicit type conversion)。所有的单参数的构造函数都应该是explicit ,从而避免后台发生的隐式的类型转换。否则,在某些宽松的规则下,会发生没有进行显示类型转换操作而产生类型转换的情况。通常,这种情况会破坏代码的可读性,并导致难以发现的错误。

        那么何为隐式类型转换(implicit type conversion)?通常单参数构造函数定义了一个隐式类型转换,可以在编译的时候进行一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象的一个临时对象,从而使赋值等操作变成兼容的,如下面例子:

    class MyClass
    {
      public:
         MyClass(int num = 0):myValue(num){}
         int read() const
           {return myValue;}
         int write(int x)
            {myValue = x;}
      private:
         int myValue;
    }
    ...
    MyClass myclass;
    myclass = 10;//this will convert int to MyClass

                以上代码定义了一个MyClass的对象myclass,并对其赋值。编译器会自动将整型转换为MyClass类对象,实际上等同于下面的操作:

    MyClass temp(10);
    MyClass myclass = temp;

            以上操作即是所谓的隐式类型转换。
            如果要避免这种自动转换的,就需要用到关键字explicit,将类的构造函数声明为"显示"。在声明构造函数的时候,前面添加上explicit关键字,这样就可以防止这种自动的转换操作,代码如下所示

    class MyClass
    {
      public:
         explict MyClass(int num = 0):myValue(num){}
         int read() const
           {return myValue;}
         int write(int x)
            {myValue = x;}
      private:
         int myValue;
    }

             这样,在进行赋值操作的时候,由于已经使用explicit,意味着单参数的构造函数不能进行隐式的类型转换,编译器就可以正确的分析出这是一个类型不匹配的问题。

  • 相关阅读:
    java中的 equals 与 ==
    String类的内存分配
    SVN用命令行更换本地副本IP地址
    npoi 设置单元格格式
    net core 微服务框架 Viper 调用链路追踪
    打不死的小强 .net core 微服务 快速开发框架 Viper 限流
    net core 微服务 快速开发框架 Viper 初体验20201017
    Anno 框架 增加缓存、限流策略、事件总线、支持 thrift grpc 作为底层传输
    net core 微服务 快速开发框架
    Viper 微服务框架 编写一个hello world 插件02
  • 原文地址:https://www.cnblogs.com/f8master/p/3826085.html
Copyright © 2020-2023  润新知