• Explicit keyword


    说实话,从来没有感觉到这个keyword实用,直到今天。

    explicit的意思是明显的,和它相相应的一个词是implicit意思是隐藏的。

    我參考了MSDNc++标准程序库》对这个keyword的描写叙述,并參考了网络上对这个keyword的解释。现将它的用法和总结记录例如以下:

    首先这个keyword仅仅能用在类构造函数。它的作用是不能进行隐式转换。

    class gxgExplicit  //没有keywordexplicit的类

    {

    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代表的是堆栈的大小,那么调用的第二句就显得不伦不类,并且easy让人疑惑。这并非能够让代码阅读者明确和接受的形式,尽管它是合法的(编译器能够通过编译)。这是由于编译器默认情况下有隐式转换的功能,你输入gE2 = 1就编译成同第一句同样的结果。所以,explicit就派上了用场。改动代码为:

    class gxgExplicit

    {

    public:

       int _size;

       explicit gxgExplicit(int size)

       {

          _size = size;

       }

    };

    继续上面的调用:

       gxgExplicit gE1(24);     //这样是没有问题的

       gxgExplicit gE2 = 1;     //这样是不行的,keyword取消了隐式转换

       gxgExplicit gE3;         //这样是不行的,没有默认构造函数

       gE1 = 2;                 //这样是不行的,keyword取消了隐式转换

       gE2 = 3;                 //这样是不行的,keyword取消了隐式转换

       gE2 = gE1;               //这样是不行的,keyword取消了隐式转换,除非类实现操作符“=”的重载。

    这是编译器(vs2005)显示:cannot convert from 'int' to 'gxgExplicit'

    从这里也就看出这个keyword的作用是将编译器隐式转换的功能给屏蔽掉。

     

    MSDN上有一个注意点描写叙述了以下的事实,当构造函数參数超过两个时自己主动取消隐式转换。比如

    class gxgExplicit

    {

    private:

       int _size;

       int _age;

    public:

       explicit gxgExplicit(int age, int size)

       {

          _age = age;

          _size = size;

       }

    };

    这是有没有keyword效果是一样的。那就是相当于有这个keyword。

    可是第二种情况例外:当中仅仅有一个必须输入的參数,其余的为有默认值的參数。

    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;

       }

    };

     

    这种情况下相当于一个參数的效果。

    到如今为止。这个keyword就是这么用了。

     

     

     

  • 相关阅读:
    LeetCode --- 字符串系列 --- 解码字母到整数映射
    LeetCode --- 字符串系列 --- 上升下降字符串
    LeetCode --- 字符串系列 --- 机器人能否返回原点
    集合 Set
    LeetCode --- 字符串系列 --- 唯一摩尔斯密码词
    LeetCode --- 字符串系列 --- 转换成小写字母
    LeetCode --- 字符串系列 --- 分割平衡字符串
    LeetCode --- 字符串系列 --- IP 地址无效化
    LeetCode --- 字符串系列 --- 左旋转字符串
    Revit二次开发八 事务标签值
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4503379.html
Copyright © 2020-2023  润新知