C++ explicit关键字的初步研究

explicit关键字用于修饰构造函数,它不允许构造函数的参数进行隐式的类型转换。构造函数参数的隐式转换有时候很方便,但有时候却容易产生误解,例如下面的代码:

#include 
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) {};即可。

你可能感兴趣的:(C++ explicit关键字的初步研究)