0%

c++ explicit关键字

如题

explicit“明确的”。
应用场景:有一个参数的构造函数时,编译时会有一个缺省的转换操作:把该函数对应数据类型的数据转换成该对象:

1
2
3
4
5
6
class String {
String ( const char* p ); // 用C风格的字符串p作为初始化值
//…
};

String s1 = “hello”; //OK 隐式转换,等价于String s1 = String(“hello”);

这种隐式转换有时候可能会让人很迷惑:

1
2
3
4
class String{
String(int n);//我想要预先分配n个字节空间备用
String(const char *p);//用c风格的字符串作初始化值
};

这样用很正常:

1
2
String s2(10);/分配10个字节空间
String s3 = String(10);//分配10个字节空间

下边这个就:

1
2
String s4 = 10;//编译通过,分配10个字节空间
String s5 = 'a';//编译通过,分配int('a')个字节空间

s4,s5分别把int型和char型,隐式转换为非配若干个字节的空字符串,让人容易误解。
为此,explicit就派上用场了:

1
2
3
4
class String {
explicit String ( int n ); //本意是预先分配n个字节给字符串,explicit抑制隐式转换
String ( const char* p ); // 用C风格的字符串p作为初始化值
};

下边这种写法正确:

1
2
String s6(10);//分配10个字节的空字符串
String s7 = String(10);//分配10个字节的空字符串

下边就不对了:

1
2
String s8 = 10;//编译不通过
String s9 = 'a';//编译不通过

ps:参考http://www.cnblogs.com/cutepig/archive/2009/01/14/1375917.html,觉得他的例子用的很好。