explicit关键字用于修饰构造函数,它不允许构造函数的参数进行隐式的类型转换。构造函数参数的隐式转换有时候很方便,但有时候却容易产生误解,例如下面的代码:
#include <iostream>
class MyString {
public:
MyString(int l) : len(l) {};
MyString(char * s) : str(s) {};
int len;
char *str;
};
int main(void) {
MyString s1(10); // 长度为10,内容未定义
MyString s2("hehe"); // 内容为hehe,长度未定义
MyString s3 = 10; // 长度为10,内容未定义
MyString s4 = 's'; // 长度为115(s的ASCII)码,内容未定义
return 0;
}
定义s3和s4的时候,发生了隐式的类型转换,这有时很有用,有时又让人费解,要禁用这里的类型转换,只要将构造函数MyString(int l) : len(l) {};
更改成explicit MyString(int l) : len(l) {};
即可。
网友评论