C++ 中的explicit构造函数

C++ explicit构造函数
 
explicit按字面意思是明确的,显式的。在C++类中只要定义的构造函数编译器就不会帮你生成默认构造函数。
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:
class String {
String ( const char* str ); // 用C风格的字符串str作为初始化值
//…
}
String str = “hello world!”; //OK 隐式转换,等价于String str = String(“hello world!”);
 
但是有的时候可能会不需要这种隐式转换,如下:
class String {
String ( int length ); //本意是预先分配length个字节给字符串
String ( const char* str ); // 用C风格的字符串str作为初始化值
//…
}
 
下面两种写法比较正常:
String str1 ( 20 );   //OK 分配20个字节的空字符串
String str2 = String ( 20 ); //OK 分配20个字节的空字符串
 
下面两种写法就比较疑惑了:
String str4 = 20; //编译通过,也是分配20个字节的空字符串
String str5 = ‘a’; //编译通过,分配int(‘a’)个字节的空字符串
 
str4 和str5 分别把一个int型和char型,隐式转换成了分配若干字节的空字符串,容易令人误解。
为了避免这种错误的发生,我们可以声明显示的转换,使用explicit 关键字:
class String {
explicit String ( int len ); //本意是预先分配len个字节给字符串
explicit String ( const char* str ); // 用C风格的字符串str作为初始化值
//…
}
加上explicit,就抑制了String ( int n )的隐式转换,
 
下面两种写法仍然正确:
String s2 ( 20 );   //OK 分配20个字节的空字符串
String s3 = String ( 20 ); //OK 分配20个字节的空字符串
 
下面两种写法就不允许了:
String s4 = 20; //编译不通过,不允许隐式的转换

String s5 = ‘a’; //编译不通过,不允许隐式的转换

************************************************************

这 就是explicit的作用,需要显式转换,不过该关键字只能用于构造函数。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章