C++ 关键字 explicit 的使用

ε祈祈猫儿з 提交于 2020-03-30 12:30:59

首先是定义:
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的

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!