zoukankan      html  css  js  c++  java
  • 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就是这么用了。

     

     

     

  • 相关阅读:
    sql 查出一张表中重复的所有记录数据
    几种常见SQL分页方式效率比较
    Redis命令参考之复制(Replication)
    Redis-benchmark使用总结
    redis压力测试详解
    c#:ThreadPool实现并行分析,并实现线程同步结束
    C#多线程学习 之 线程池[ThreadPool]
    [C#基础]ref和out的区别
    C#:ref和out的联系及区别。
    生产环境中使用Docker Swarm的一些建议
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4590464.html
Copyright © 2011-2022 走看看