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

  • 文章来源:51cto博客
  • 转载说明:仅为促进国内科技技术发展,为IT工作者解决开发难题。
  • 版权声明:文章来源于网络采集,版权归原创者所有,均已注明来源,如未注明可能来源未知,如有侵权请联系管理员删除。

发表回复

后才能评论