explicit用来明确禁止隐式转换,而且只在构造函数的入参是一个的时候才有意义,因为隐式转换至发生在单参数构造函数的情景
1 class Test1
2 {
3 public:
4 Test1(int n) { num = n; } //普通构造函数
5 private:
6 int num;
7 };
8
9 class Test2
10 {
11 public:
12 explicit Test2(int n) { num = n; } //explicit(显式)构造函数
13 private:
14 int num;
15 };
16
17 int main()
18 {
19 Test1 t1 = 12; //隐式调用其构造函数, 成功
20 Test2 t2 = 12; //编译错误,不能隐式调用其构造函数
21 Test2 t3(12); //显示调用成功
22 return 0;
23 }
Test1的构造函数带一个int型的参数,代码19行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码20行会出现编译错误。
普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。
对于 Test1 t1 = 12; 这样动作会被编译器翻译为2个步骤:
1)使用12创建一个Test1临时对象;
2)使用Test1的赋值构造函数,将1)中生成的临时对象作为参数传递给赋值构造函数。
注:有些类会禁用拷贝构造和赋值构造,那么上述动作会在编译时报错。
小结:
c++延续了c的语法严谨性,所有的动作都是可以一步步推导的,只要把握住基本的知识点即可