explicit关键字

C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

在C++中,如果一个类只有一个参数的构造函数,C++允许一种特殊的声明类变量的方式。即可以直接将一个对应于构造函数参数类型的数据直接赋值给类变量,编译器在编译时会自动进行类型转换,将对应于构造函数参数类型的数据转换为类的对象。如果在构造函数前加上explicit修饰词,则会禁止这种自动转换,此时,即使将对应于构造函数参数类型的数据直接赋值给类变量,编译器也会报错。

explicit使用注意事项

explicit 关键字只能用于类内部的构造函数声明上,且作用于单个参数的构造函数。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
class Student
{
public:
int age;
Student (int a) {age=a;}
};
void foo ( void )
{
 Student s1(10);  //方式一
 Student* p_s2=new Student(10); //方式二
 Student s3=10; //方式三
}

第三种方式比较特殊,因为C++是一种强类型语言,不同的数据类型是不能随意转换的,必须进行显式或隐式的类型转换,这里,没有进行任何显式转换,直接将一个整型数据赋值给了类变量s3.这里是进行了一次隐式类型转换,编译器自动将对应于构造函数参数类型的数据转换为了该类的对象,最终方式三经编译器自动转换后和方式一的实现方式是相同的。