对于C++中的explicit关键字的认识

今天在学习Effective C++时,我遇到一个以前从未见过的关键字:explicit(显式的,adj)

今天刚好的中秋佳节,祝自己和亲朋好友们月饼节快乐噢!嘻嘻

现在刚回到实验室,就顺便用博客记录一下自己对于这个"新"关键字的学习认识。

        C++中的关键字implicitexplicit主要是用来修饰类的构造函数的,被explicit关键字修饰了的构造函数的类,就不能发生相应的隐式implicit的类型转换,只能以显示的explicit的方式进行类型转换。当然,类构造函数默认情况下是声明为隐式的即implicit的(也即默认case下你写的类的构造函数是可以进行隐式的类型转换的)。

        隐式转换即是:可以由 单个实参 来调用的构造函数 定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。

         explicit关键字只能用类内部的构造函数的声明,而不能用在类外部的函数定义(函数实现)上(当然,这里的类内部和类外部要看你怎么写代码了,若是分文件编写,则如上述来理解,若是把类的声明和定义实现都放在同一个.cpp文件中,把类内部类外部这几个字去掉就好理解了),explicit的作用是 让构造函数不能进行隐式转换

注意:

        1:一般而言,explicit关键字是作用于单个参数的构造函数

        2:如果构造函数有多个参数,但是从第二个参数开始,如果各参数均有默认值的话,那么此种case我们也可以应用explicit关键字,让该构造函数的第一个参数不能进行隐式的转换。

        3:当构造函数只有一个参数时,默认会进行自动隐式转换,当构造函数参数个数超过或等于两个时自动取消隐式转换,当只有一个必须输入的参数,其余的为有默认值的参数时,使用explicit也是起作用的。

        4:一般只将有单个参数的构造函数声明为explicit的,而拷贝构造函数不要声明为explicit。

        5:explicit关键字只能对用户自己定义的对象起作用不对默认构造函数起作用此关键字只能够修饰构造函数。无参数的构造函数和多参数的构造函数总是显示调用,这种case下,再在构造函数前加explicit是毫无意义的。

        6:当你不希望构造函数在传递参数时进行自动类型转换,那么不妨就使用explicit关键字让其只能do显式的转换(标准库的类中的许多构造函数都是explicit的。)

参考:

C++中的explicit关键字介绍

你可能感兴趣的:(c++)