C++ Explicit关键字详细解析

 更新时间:2013年09月22日 10:20:22   投稿:jingxian  
以下是对C++中Explicit关键字的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字。
首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用是不能进行隐式转换。

复制代码 代码如下:

    class gxgExplicit  //没有关键字explicit的类
    {
      public:
          int _size;
         gxgExplicit(int size)
        {
           _size = size;
        }
     };

下面是调用
   gxgExplicit gE1(24);     //这样是没有问题的
   gxgExplicit gE2 = 1;     //这样也是没有问题的
   gxgExplicit gE3;         //这样是不行的,没有默认构造函数
   gE1 = 2;                 //这样也是没有问题的
   gE2 = 3;                 //这样也是没有问题的
   gE2 = gE1;               //这样也是没有问题的

但是假如gxgExplicit修改为Stack,我们的_size代表的是堆栈的大小,那么调用的第二句就显得不伦不类,而且容易让人疑惑。这并不是可以让代码阅读者明白和接受的形式,虽然它是合法的(编译器可以通过编译)。这是因为编译器默认情况下有隐式转换的功能,你输入gE2 = 1就编译成同第一句相同的结果。所以,explicit就派上了用场。修改代码为:

复制代码 代码如下:

class gxgExplicit
    {
      public:
           int _size;
           explicit gxgExplicit(int size)
           {
             _size = size;
           }
    };

继续上面的调用:
   gxgExplicit gE1(24);     //这样是没有问题的
   gxgExplicit gE2 = 1;     //这样是不行的,关键字取消了隐式转换
   gxgExplicit gE3;         //这样是不行的,没有默认构造函数
   gE1 = 2;                 //这样是不行的,关键字取消了隐式转换
   gE2 = 3;                 //这样是不行的,关键字取消了隐式转换
   gE2 = gE1;               //这样是不行的,关键字取消了隐式转换,除非类实现操作符“=”的重载。

这是编译器(vs2005)显示:cannot convert from 'int' to 'gxgExplicit'。
从这里也就看出这个关键字的作用是将编译器隐式转换的功能给屏蔽掉。
MSDN上有一个注意点描述了下面的事实,当构造函数参数超过两个时自动取消隐式转换。例如

复制代码 代码如下:

    class gxgExplicit
    {
      private:
         int _size;
         int _age;
      public:
          explicit gxgExplicit(int age,int size)
         {
            _age = age;
            _size = size;
         }
     };

这是有没有关键字效果是一样的。那就是相当于有这个关键字。
但是另外一种情况例外:其中只有一个必须输入的参数,其余的为有默认值的参数。
复制代码 代码如下:

class gxgExplicit
{
private:
   int _size;
   int _age;
public:
   explicit gxgExplicit(int age,int size = 0)
   {
      _age = age;
      _size = size;
   }
};
class gxgExplicit
{
private:
   int _size;
   int _age;
int _hight;
public:
   explicit gxgExplicit(int age,int size = 0)
   {
      _age = age;
      _size = size;
      _hight = hight;
   }
};

相关文章

  • VC中删除类的两种操作方法

    VC中删除类的两种操作方法

    这篇文章主要介绍了VC中删除类的两种操作方法,较为详细的描述了在VC中实现删除类的具体步骤,非常具有实用价值,需要的朋友可以参考下
    2015-05-05
  • C++中Boost的智能指针weak_ptr

    C++中Boost的智能指针weak_ptr

    这篇文章介绍了C++中Boost的智能指针weak_ptr,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • 解读C++为何迭代器常用auto类型

    解读C++为何迭代器常用auto类型

    C++中迭代器类型复杂且多变,auto关键字自动推导类型,简化代码、提升效率,减少类型错误,符合现代编程趋势,是遍历容器的标准做法
    2025-09-09
  • C语言全排列回溯算法介绍

    C语言全排列回溯算法介绍

    大家好,本篇文章主要讲的是C语言全排列回溯算法介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C语言实现二叉树遍历的迭代算法

    C语言实现二叉树遍历的迭代算法

    这篇文章主要介绍了C语言实现二叉树遍历的迭代算法,包括二叉树的中序遍历、先序遍历及后序遍历等,是非常经典的算法,需要的朋友可以参考下
    2014-09-09
  • C++使用printf语句实现进制转换的示例代码

    C++使用printf语句实现进制转换的示例代码

    在C语言中,printf 函数可以直接实现部分进制转换功能,通过格式说明符(format specifier)快速输出不同进制的数值,下面给大家分享C++使用printf语句实现进制转换的示例代码,感兴趣的朋友一起看看吧
    2025-04-04
  • C++线程同步实例分析

    C++线程同步实例分析

    这篇文章主要介绍了C++线程同步实例分析,以实例的形式较为深入的分析了C++的线程同步问题,是一个较为经典的线程同步问题,需要的朋友可以参考下
    2014-10-10
  • Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围

    Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围

    在日常开发过程中QLineEdit作为输入框,有时要限制输入的内容,这篇文章主要给大家介绍了关于Qt实现QLineEdit输入前提示输入范围并用正则表达式限制输入范围的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • 使用C语言实现CRC校验的方法

    使用C语言实现CRC校验的方法

    本篇文章是对使用C语言实现CRC校验的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • OpenCV基于稠密光流实现视频跟踪详解

    OpenCV基于稠密光流实现视频跟踪详解

    这篇文章主要为大家详细介绍了OpenCV如何基于稠密光流实现视频跟踪功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-02-02

最新评论