显式构造函数通过explicit关键字防止隐式类型转换,避免意外的构造行为。当类的构造函数只有一个参数或多个参数但其余有默认值时,编译器可能自动进行隐式转换,导致非预期结果。例如,int可被隐式转为MyString对象,引发逻辑错误。使用explicit后,只能显式调用构造函数,如MyString(10),而不能隐式转换。建议对所有单参数构造函数使用explicit,除非确实需要隐式转换。C++11起支持多参数explicit构造函数,增强代码安全性和可读性。常见于智能指针、容器和数值封装类。

在C++中,显式构造函数(使用
explicit
当一个类的构造函数只有一个参数(或多个参数但除了第一个外都有默认值),编译器可能会在不需要显式调用的情况下,自动将参数类型转换为该类类型。这种隐式转换虽然有时方便,但也容易引发问题。
例如:
class MyString {void printString(const MyString& s) { }
立即学习“C++免费学习笔记(深入)”;
int main() {
printString("Hello"); // 正确:隐式转换为 MyString
printString(10); // 问题:int 被隐式转为 MyString,可能不是预期行为
return 0;
}
上面的
printString(10)
MyString(int)
通过在单参数构造函数前加上
explicit
int main() {
printString("Hello"); // OK:const char* 到 MyString 允许
// printString(10); // 错误:不能隐式转换 int 到 MyString
printString(MyString(10)); // OK:显式构造
return 0;
}
此时,
printString(10)
printString(MyString(10))
explicit
explicit
例如:
explicit MyString(int size, char c = '\0'); // 多参数也可显式基本上就这些。使用
explicit
以上就是C++显式构造函数 防止隐式转换的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号