C++ explicit [复制链接]
发表于 2025-9-21 22:23:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
1. 什么是 explicit?​​

explicit 是 C++ 中的一个关键字,用于​​阻止隐式范例转换​​。
它可以用在以下两种场景:

  • ​​构造函数​​:防止编译器通过该构造函数举行隐式转换。
  • ​​转换运算符​​(C++11 起):防止通过范例转换运算符的隐式转换。
​​2. 为什么必要 explicit?​​

隐式转换大概导致代码举动不直观,乃至隐蔽错误。
比方,一个构造函数继续 int 参数,但你不渴望代码中直接通报 int 被主动转换为你的类范例。
explicit 欺压步调员​​显式调用转换​​,进步代码安全性和可读性。
​​3. 用于构造函数​​

​​没有 explicit 的环境​​

假设有一个类的构造函数继续 int 参数:
  1. class MyClass {
  2. public:
  3.     MyClass(int x) { /* ... */ }  // 允许隐式转换
  4. };
  5. void func(MyClass obj) {}
  6. int main() {
  7.     func(10);  // 合法!编译器隐式将 10 转换为 MyClass 对象
  8. }
复制代码
这里,func(10) 会隐式调用 MyClass(int) 构造函数,大概产生意业务料之外的举动。
​​利用 explicit 后​​
  1. class MyClass {
  2. public:
  3.     explicit MyClass(int x) { /* ... */ }  // 阻止隐式转换
  4. };
  5. void func(MyClass obj) {}
  6. int main() {
  7.     func(10);               // 错误!不能隐式转换
  8.     func(MyClass(10));      // 合法!显式构造
  9.     func(static_cast<MyClass>(10));  // 合法!显式类型转换
  10. }
复制代码
此时必须​​显式构造对象​​,制止隐式转换带来的歧义。​​
4. 用于转换运算符(C++11 起)​​

假设一个类必要转换为 bool 范例(比方判断对象是否有效):
  1. class MyClass {
  2. public:
  3.     explicit operator bool() const {
  4.         return /* 检查是否有效 */;
  5.     }
  6. };
  7. MyClass obj;
  8. if (obj) { ... }            // 合法!显式转换为 bool
  9. bool b = obj;               // 错误!隐式转换被阻止
  10. bool b = static_cast<bool>(obj);  // 合法!显式转换
复制代码
只有​​显式调用转换​​时(如 if (obj) 或 static_cast),才会触发转换。
​​5. 关键细节​​

​​1. 隐式转换的常见场景​​


  • 函数传参时通报不同范例。
  • 赋值初始化(如 MyClass obj = 10;)。
2. ​​explicit 与多参数构造函数(C++11 起)​​


  • 纵然构造函数有多个参数,只要它们能通过默认参数或列表初始化被调用,也可以标记为 explicit:
  1. explicit MyClass(int a, int b = 0);  // 必须显式调用
复制代码
3. 何时利用?​​


  • 当隐式转换大概导致歧义或错误时(比方智能指针、字符串包装类)。
  • 当类筹划必要严酷范例控制时。
4. 何时不消?​​


  • 当隐式转换是安全的且符合直觉时(比方数值范例的包装类)。
​​6. 实际应用示例​​

标准库中的 explicit
1. std::shared_ptr​​ 的构造函数是 explicit 的:
  1. std::shared_ptr<int> p = new int;  // 错误!
  2. std::shared_ptr<int> p(new int);   // 合法!​​
复制代码
2. std::string​​ 的构造函数继续 const char* 且为 explicit:
  1. void print(const std::string& s);
  2. print("hello");  // 合法!因为 C++17 起允许隐式转换
  3. // 但早期版本可能需要显式转换。
复制代码
​​7. 总结​​


  • 焦点作用​​:欺压显式范例转换,制止隐式转换的埋伏题目。
  • ​​代码安全​​:镌汰因范例主动转换导致的 Bug。
  • 代码清晰​​:让范例转换的意图更明白。
通过公道利用 explicit,可以写出更结实、更易维护的 C++ 代码!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表