面试题: C++ 中 explicit 的作用?

在 C++ 中,explicit 是一个用于修饰构造函数或转换运算符的关键字,它的作用是禁止隐式类型转换,防止编译器自动执行不期望的转换,从而提高代码的安全性和可读性。


1. 用于构造函数

explicit 用于构造函数时,表示该构造函数不能用于隐式类型转换,只能用于显式调用。

语法

class ClassName {
public:
    explicit ClassName(parameters) {
        // 构造函数实现
    }
};

示例

class MyString {
public:
    explicit MyString(int size) {
        std::cout << "Constructed with size: " << size << std::endl;
    }
};

void printString(const MyString& str) {
    // 打印字符串
}

int main() {
    MyString s1(10); // 正确:显式调用构造函数
    MyString s2 = 20; // 错误:explicit 禁止隐式转换
    printString(30); // 错误:explicit 禁止隐式转换
    printString(MyString(40)); // 正确:显式调用构造函数
    return 0;
}

作用

  • 防止编译器自动将参数类型隐式转换为类类型,避免意外的行为。
  • 适用于单参数构造函数或具有默认参数的构造函数。

2. 用于转换运算符

explicit 用于转换运算符时,表示该转换运算符不能用于隐式类型转换,只能用于显式调用。

语法

class ClassName {
public:
    explicit operator TargetType() const {
        // 转换逻辑
    }
};

示例

class MyBool {
public:
    explicit operator bool() const {
        return true;
    }
};

int main() {
    MyBool b;
    if (b) { // 错误:explicit 禁止隐式转换
        std::cout << "True" << std::endl;
    }
    if (static_cast<bool>(b)) { // 正确:显式调用转换运算符
        std::cout << "True" << std::endl;
    }
    return 0;
}

作用

  • 防止编译器自动将类类型隐式转换为其他类型,避免意外的行为。
  • 适用于需要严格控制类型转换的场景。

3. 使用场景

  • 单参数构造函数:防止隐式类型转换导致的意外行为。
  • 转换运算符:防止隐式类型转换导致的意外行为。
  • 提高代码安全性:明确类型转换的意图,避免隐式转换带来的潜在问题。

4. 总结

用途作用
构造函数禁止隐式类型转换,只能显式调用构造函数。
转换运算符禁止隐式类型转换,只能显式调用转换运算符。
设计意图提高代码的安全性和可读性,避免隐式转换带来的潜在问题。

explicit 是 C++ 中非常重要的关键字,合理使用它可以避免许多隐式类型转换带来的问题,尤其是在设计类时。

THE END
点赞7 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容