C++面试基础系列-explicit

系列文章目录


文章目录


C++面试基础系列-explicit

文章目录

Overview

1.explicit

在 C++ 中,"explicit" 关键字用于类构造函数,以防止隐式类型转换和复制初始化。使用 explicit 可以提高代码的安全性,因为它要求在转换类型时必须明确地进行。下面是一些关于 explicit 的使用场景和示例:

1.1.使用场景

  1. 防止隐式转换:当你希望类的构造函数只用于显示转换,而不是由编译器隐式执行时。
  2. 避免歧义 :在多构造函数的情况下,explicit 可以避免编译器在选择调用哪个构造函数时产生歧义。

1.2.语法

cpp 复制代码
class MyClass {
public:
    explicit MyClass(Type param) {
        // 构造函数实现
    }
    // 其他成员和方法
};

1.3.示例

1.3.1.防止隐式类型转换
cpp 复制代码
class NumericString {
public:
    explicit NumericString(const std::string& s) {
        // 初始化逻辑,可能包括检查字符串是否只包含数字
    }
};

int main() {
    NumericString ns("123"); // 正确,显示转换
    // NumericString ns2 = "123"; // 错误,因为构造函数是 explicit 的
    return 0;
}
1.3.2.构造函数重载解析

如果有多个构造函数,explicit 可以帮助编译器确定应该调用哪个构造函数。

cpp 复制代码
class Date {
public:
    Date(int day, int month, int year) { /* ... */ } // 普通构造函数
    explicit Date(const std::string& dateString) { /* ... */ } // 显式构造函数
};

int main() {
    Date d1(1, 1, 2023); // 调用第一个构造函数
    Date d2("2023-01-01"); // 调用第二个构造函数,需要显示转换
    // Date d3 = "2023-01-01"; // 错误,因为第二个构造函数是 explicit 的
    return 0;
}

1.4.注意事项

  • 默认情况下,所有构造函数都是隐式的。添加 explicit 关键字后,构造函数就不再参与隐式转换。
  • explicit 只能用在单个参数的构造函数上。如果你需要调用一个多参数的构造函数,可以定义一个转换操作符或工厂函数。
  • 在 C++11 及以后的版本中,列表初始化可以绕过 explicit 的限制,因此要谨慎使用。

通过使用 explicit,你可以在设计类时提供额外的安全性,防止错误的类型转换和潜在的 bug。

关于作者

相关推荐
一杯美式 no sugar几秒前
类和对象(中)
开发语言·c++
qq_416018723 分钟前
实时数据可视化库
开发语言·c++·算法
格林威3 分钟前
工业相机参数解析:曝光时间与运动模糊的“生死博弈”
c++·人工智能·数码相机·opencv·算法·计算机视觉·工业相机
_杨瀚博8 分钟前
JAVA找出哪个类import了不存在的类
java·后端
2401_8732046517 分钟前
C++中的策略模式进阶
开发语言·c++·算法
OKkankan18 分钟前
深入理解linux进程
java·linux·c++
HABuo18 分钟前
【linux线程(一)】线程概念、线程控制详细剖析
linux·运维·服务器·c语言·c++·ubuntu·centos
王老师青少年编程18 分钟前
2026年3月GESP真题及题解(C++七级):物流网络
c++·题解·真题·gesp·csp·七级·物流网络
xushichao198922 分钟前
C++中的职责链模式实战
开发语言·c++·算法
fqbqrr24 分钟前
2603C++,C++强项
c++