📜  显式在 c++ 中的含义 - C++ (1)

📅  最后修改于: 2023-12-03 15:10:30.920000             🧑  作者: Mango

显式在 C++ 中的含义 - C++

在 C++ 中,关键字 explicit 可以用来修饰类的构造函数,包括普通构造函数和转换构造函数。其含义如下:

当一个构造函数被标记为 explicit 时,在使用该构造函数进行对象的隐式类型转换时,编译器会禁止这种转换。只有在进行显式转换的时候,才会使用该构造函数进行对象的创建。

示例代码

下面是一个简单的示例代码,演示了如何使用 explicit 关键字:

class MyString {
public:
    MyString(int n); // 普通构造函数
    explicit MyString(char* s); // 转换构造函数
}

int main()
{
    MyString str1 = 10; // OK,使用普通构造函数
    MyString str2 = "Hello"; // 编译错误,禁止隐式类型转换
    MyString str3("World"); // OK,使用转换构造函数

    return 0;
}

在该示例代码中,MyString 类具有两个构造函数,其中一个是普通构造函数,另一个是转换构造函数,分别用来创建 MyString 类型的对象。在 main 函数中,创建了三个 MyString 类型的对象,其中 str1 对象使用了普通构造函数进行创建,而 str2 对象使用了转换构造函数,且在该语句中使用了隐式类型转换,因此编译器会报错。为了解决这个问题,可以将转换构造函数标记为 explicit,如下:

class MyString {
public:
    MyString(int n);
    explicit MyString(char* s); // 指定为转换构造函数
}

int main()
{
    MyString str1 = 10; // OK,使用普通构造函数
    MyString str2 = "Hello"; // 编译错误,禁止隐式类型转换
    MyString str3("World"); // OK,使用转换构造函数

    return 0;
}

结果,编译器会禁止隐式类型转换,因此程序的正确性得到了保证。

总结

使用 explicit 关键字可以避免类构造函数的隐式类型转换,防止出现错误。在编写程序时,程序员可以根据实际情况选择是否使用该关键字,以避免程序出现问题。