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。

关于作者

相关推荐
技术无疆19 分钟前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
2401_8582861122 分钟前
52.【C语言】 字符函数和字符串函数(strcat函数)
c语言·开发语言
铁松溜达py23 分钟前
编译器/工具链环境:GCC vs LLVM/Clang,MSVCRT vs UCRT
开发语言·网络
everyStudy23 分钟前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
C-SDN花园GGbond2 小时前
【探索数据结构与算法】插入排序:原理、实现与分析(图文详解)
c语言·开发语言·数据结构·排序算法
迷迭所归处3 小时前
C++ —— 关于vector
开发语言·c++·算法
架构文摘JGWZ3 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
leon6253 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
CV工程师小林3 小时前
【算法】BFS 系列之边权为 1 的最短路问题
数据结构·c++·算法·leetcode·宽度优先
拾光师4 小时前
spring获取当前request
java·后端·spring