zoukankan      html  css  js  c++  java
  • C++ 关键字 explicit 的使用

    首先是定义:
    explicit关键字只能修饰只有一个参数的构造函数,或者有多个参数,但是除第一个参数外其他的参数都有默认值的构造函数。它的作用是表明构造函数是显式方式显示的。(类构造函数默认为隐式)

    如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了

    举个例子:

    class AMD{
    public:
        AMD(int level){  //这里的构造函数默认就是隐式声明
            .....
            }
    .....
    }

    在这种情况下,如果运行以下语句:

    AMD a(3);
    AMD b=10;

    这两种都是没有问题的,第二句 AMD b=10; 没有问题的原因是:C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象.
    也就是说 AMD b=10 在实际执行时操作等同于以下语句:

    AMD b(10);
    //或者
    AMD c(10);
    AMD b = c;

    虽然解释的通了,但是这种写法仍然是不友好的,毕竟 AMD b=10 这种写法看上去就像是将整数赋值给对象,显得不伦不类,而且在复杂代码中容易让人感到迷惑 -->所以现在就要使用到explicit关键字了

    经过explicit修饰后:

    class AMD{
    public:
        explicit AMD(int level){  //修饰后构造函数就是显式声明
            .....
            }
    .....
    }

    此时,再去执行之前那两条语句,
    AMD a(3);依旧是没什么问题,但是 AMD b=10 就不再可行了(explicit防止了类构造函数的隐式自动转换)

    C++ 关键字 explicit 的使用

    (此时编译就会出错)

    依照explicit关键字的定义,它还可以修饰多个参数(其中只有一个没有缺省值)的构造函数:

    class AMD{
    public:
        explicit AMD(int level,int size=0....){  //除了第一个参数都有缺省值
            .....
            }
    .....
    }

    这种情况下explicit关键字也是起作用的,使用AMD b = 10 等会产生隐式类型转换的语句依旧会报错。

    由于用explicit修饰的构造函数会避免 意料不到 的类型变换,而且没有什么缺点,所以一般情况下还是鼓励使用explicit的

  • 相关阅读:
    小知识!
    命令级的python静态资源服务。
    自定义滚动条样式-transition无效
    css:a:visited限制
    react16 渲染流程
    virtual-dom
    用video标签流式加载
    golang 代码笔记
    position:fixed not work?
    go/node/python 多进程与多核cpu
  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13756220.html
Copyright © 2011-2022 走看看