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的

posted @ 2020-03-30 12:03  Kaniso_Vok  阅读(107)  评论(0编辑  收藏  举报