首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C++面试基础系列-explicit

  • 25-02-19 04:41
  • 2907
  • 7464
blog.csdn.net

系列文章目录

总目录链接


文章目录

  • 系列文章目录
    • 总目录链接
  • C++面试基础系列-explicit
    • Overview
    • 1.explicit
      • 1.1.使用场景
      • 1.2.语法
      • 1.3.示例
        • 1.3.1.防止隐式类型转换
        • 1.3.2.构造函数重载解析
      • 1.4.注意事项
    • 关于作者


C++面试基础系列-explicit

文章目录

  • 系列文章目录
    • 总目录链接
  • C++面试基础系列-explicit
    • Overview
    • 1.explicit
      • 1.1.使用场景
      • 1.2.语法
      • 1.3.示例
        • 1.3.1.防止隐式类型转换
        • 1.3.2.构造函数重载解析
      • 1.4.注意事项
    • 关于作者

Overview

1.explicit

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

1.1.使用场景

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

1.2.语法

class MyClass {
public:
    explicit MyClass(Type param) {
        // 构造函数实现
    }
    // 其他成员和方法
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.3.示例

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

int main() {
    NumericString ns("123"); // 正确,显示转换
    // NumericString ns2 = "123"; // 错误,因为构造函数是 explicit 的
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
1.3.2.构造函数重载解析

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1.4.注意事项

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

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

关于作者

  • 微信公众号:WeSiGJ
  • GitHub:https://github.com/wesigj/cplusplusboys
  • CSDN:https://blog.csdn.net/wesigj
  • 微博:
  • -版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
WeSiGJ
微信公众号
共同分享,共同交流, 共同学习!
注:本文转载自blog.csdn.net的WeSiGJ的文章"https://blog.csdn.net/wesigj/article/details/141451894"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top