C++当中的explicit关键字平时用的比较少,但是要想稍深入地学习C++,这个还是必须的。
首先,明确一点,explicit关键字只是用来修饰构造函数的;而且它只会出现在类中的构造函数声明之前。
其次,explicit关键字是用来抑制由构造函数定义的隐式转换的。那么我们首先需要知道什么是由构造函数定义的隐式转换?
下面的代码演示了这种转换:
- class MyClass
- {
- public:
- MyClass( int num );
- }
- //...
- MyClass obj = 10; //ok,convert int to MyClass
当定义了MyClass类的MyClass(int num);构造函数后,C++就允许最后一行的那种构造方法,这就叫做由构造函数定义的隐式转换。
而explicit关键字的作用,正是抑制这种隐式转换的发生。对以上代码进行如下修改:
- class MyClass
- {
- public:
- explicit MyClass( int num ); //add a explicit in front of constructor
- }
- //...
- MyClass obj = 10; //compiler error, implicit convert is not allowed now.
- MyClass obj = MyClass(10); //OK, because this is a explicit convert.
当定义了explicit关键字后,隐式转换就会报错。这时只能使用显式转换。
使用explicit关键字需要注意的问题:
- explicit关键字只需要在类定义中的构造函数声明语句的头部书写,在构造函数的定义处不用写了。写了会报错。
关于explicit使用的建议:
- 如果没有很合适的理由说明必须使用隐式转换,而且如果你的构造函数是单形参的,那么最好声明explicit,这样可以避免错误。当然,多形参的构造函数是没有构造函数的隐式转换的,所以也没必要声明explicit。