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。

关于作者

相关推荐
灰灰勇闯IT12 分钟前
RN路由与状态管理:打造多页面应用
开发语言·学习·rn路由状态
wd_cloud12 分钟前
QT/6.7.2/Creator编译Windows64 MySQL驱动
开发语言·qt·mysql
菜鸟233号14 分钟前
力扣513 找树左下角的值 java实现
java·数据结构·算法·leetcode
亭上秋和景清16 分钟前
指针进阶:函数指针详解
开发语言·c++·算法
胡萝卜3.016 分钟前
C++现代模板编程核心技术精解:从类型分类、引用折叠、完美转发的内在原理,到可变模板参数的基本语法、包扩展机制及emplace接口的底层实现
开发语言·c++·人工智能·机器学习·完美转发·引用折叠·可变模板参数
9ilk18 分钟前
【C++】--- C++11
开发语言·c++·笔记·后端
FMRbpm36 分钟前
队列练习--------最近的请求次数(LeetCode 933)
数据结构·c++·leetcode·新手入门
biter down1 小时前
C++ 函数重载:从概念到编译原理
开发语言·c++
Neoest1 小时前
【EasyExcel 填坑日记】“Syntax error on token )“: 一次编译错误在逃 Runtime 的灵异事件
java·eclipse·编辑器
自在极意功。1 小时前
Web开发中的分层解耦
java·microsoft·web开发·解耦