explicit意思为“明确的”和“清楚的”,是C++的关键词,意在阻止隐式类型的转换;
有时候不合法的隐式转换,会让乖巧听话的程序变得不可控。所以适当地使用explicit关键字是有必要的。
如 string str = 'a'; 这样的赋值是不能通过编译,错误原因是 invalid conversion from ‘char’ to ‘const char*,也就是“不能做隐式char->const char转换”。
1、只能用于类内部构造函数的声明前,不能用于类外部构造函数的实现前;
2、只能作用于构造函数的一个参数、或者有默认值的多个参数。
现有一个testDog的函数,函参是一个Dog类的对象。Dog类只提供了一个设置成员变量age的构造函数。
1、传入name的构造函数,没有使用explicit关键字,直接对testDog传入一个string或者char *,也能得到想要的输出。其中隐式地将 "Huskie" 转换为一个“name = Huskie,age = 0”的Dog类对象。
2、传入age的构造函数,使用了explicit关键字,参数传入int型的2会编译不过,表示“不能做隐式int->Dog转换”。将Dog(2)当做函参传入就会解决此问题。
1 #include <iostream>
2 using namespace std;
3
4 class Dog
5 {
6 public:
7 string name;
8 int age;
9
10 explicit Dog(int age_)
11 {
12 name = "Huskie";
13 age = age_;
14 }
15 Dog(const char* p)
16 {
17 name = p;
18 age = 0;
19 }
20 };
21
22 void testDog(Dog onedog)
23 {
24 cout<<"Dog's name is :"<<onedog.name<<", age :"<<onedog.age<<endl;
25 }
26
27 int main()
28 {
29 string str = 'a';//invalid conversion from ‘char’ to ‘const char*
30 //即编译出错,不能做隐式char->const char转换
31
32 Dog dog1 = 2;//编译出错,不能做隐式int->Dog转换
33 Dog dog2 = "haha";
34
35 cout<<"Test dog:"<<endl;
36 testDog("Shiba Inu");
37 testDog(2);//编译出错,不能做隐式int->Dog转换
38 testDog(Dog(2));
39 return 0;
40 }