首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
Oracle
›
C++ explicit
返回列表
发新帖
C++ explicit
[复制链接]
发表于 2025-9-21 22:23:51
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
1. 什么是 explicit?
explicit 是 C++ 中的一个关键字,用于阻止隐式范例转换。
它可以用在以下两种场景:
构造函数:防止编译器通过该构造函数举行隐式转换。
转换运算符(C++11 起):防止通过范例转换运算符的隐式转换。
2. 为什么必要 explicit?
隐式转换大概导致
代码
举动不直观,乃至隐蔽错误。
比方,一个构造函数继续 int 参数,但你不渴望
代码
中直接通报 int 被主动转换为你的类范例。
explicit 欺压步调员显式调用转换,进步
代码
安全
性和可读性。
3. 用于构造函数
没有 explicit 的环境
假设有一个类的构造函数继续 int 参数:
class MyClass {
public:
MyClass(int x) { /* ... */ } // 允许隐式转换
};
void func(MyClass obj) {}
int main() {
func(10); // 合法!编译器隐式将 10 转换为 MyClass 对象
}
复制代码
这里,func(10) 会隐式调用 MyClass(int) 构造函数,大概产生意业务料之外的举动。
利用 explicit 后
class MyClass {
public:
explicit MyClass(int x) { /* ... */ } // 阻止隐式转换
};
void func(MyClass obj) {}
int main() {
func(10); // 错误!不能隐式转换
func(MyClass(10)); // 合法!显式构造
func(static_cast<MyClass>(10)); // 合法!显式类型转换
}
复制代码
此时必须显式构造对象,制止隐式转换带来的歧义。
4. 用于转换运算符(C++11 起)
假设一个类必要转换为 bool 范例(比方判断对象是否有效):
class MyClass {
public:
explicit operator bool() const {
return /* 检查是否有效 */;
}
};
MyClass obj;
if (obj) { ... } // 合法!显式转换为 bool
bool b = obj; // 错误!隐式转换被阻止
bool b = static_cast<bool>(obj); // 合法!显式转换
复制代码
只有显式调用转换时(如 if (obj) 或 static_cast),才会触发转换。
5. 关键细节
1. 隐式转换的常见场景
函数传参时通报不同范例。
赋值初始化(如 MyClass obj = 10;)。
2. explicit 与多参数构造函数(C++11 起)
纵然构造函数有多个参数,只要它们能通过默认参数或列表初始化被调用,也可以标记为 explicit:
explicit MyClass(int a, int b = 0); // 必须显式调用
复制代码
3. 何时利用?
当隐式转换大概导致歧义或错误时(比方智能指针、字符串包装类)。
当类筹划必要严酷范例控制时。
4. 何时不消?
当隐式转换是
安全
的且符合直觉时(比方数值范例的包装类)。
6. 实际应用示例
标准库中的 explicit
1. std::shared_ptr 的构造函数是 explicit 的:
std::shared_ptr<int> p = new int; // 错误!
std::shared_ptr<int> p(new int); // 合法!
复制代码
2. std::string 的构造函数继续 const char* 且为 explicit:
void print(const std::string& s);
print("hello"); // 合法!因为 C++17 起允许隐式转换
// 但早期
版本
可能需要显式转换。
复制代码
7. 总结
焦点作用:欺压显式范例转换,制止隐式转换的埋伏题目。
代码
安全
:镌汰因范例主动转换导致的 Bug。
代码清晰:让范例转换的意图更明白。
通过公道利用 explicit,可以写出更结实、更易维护的 C++ 代码!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
返回列表
浏览过的版块
云原生
网络安全
王國慶
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表