explicit关键字
阅读数:193 评论数:0
跳转到新版页面分类
C/C++
正文
在C++中,explicit
关键字用于修饰类的构造函数,以防止发生隐式类型转换。默认情况下,如果一个构造函数只接受一个参数,它可以被用来进行隐式转换,也就是说,编译器可以自动地将一个给定类型的对象转换为构造函数所在的类的类型。
举一个没有使用explicit
关键字的例子:
class MyClass {
public:
MyClass(int value) {} // 隐式转换构造函数
};
void functionTakingMyClass(MyClass obj) {}
int main() {
functionTakingMyClass(5); // 隐式转换 int 到 MyClass
return 0;
}
在上面的例子中,functionTakingMyClass
接受一个MyClass
类型的对象,但是在调用它时传递了一个整数5
。由于MyClass
的构造函数接受一个int
参数,编译器将自动地将5
转换成MyClass
对象。
现在,如果我们不想这种隐式转换发生,我们可以在构造函数前加上explicit
关键字:
class MyClass {
public:
explicit MyClass(int value) {} // 阻止隐式转换
};
void functionTakingMyClass(MyClass obj) {}
int main() {
functionTakingMyClass(5); // 错误!不能隐式转换 int 到 MyClass
functionTakingMyClass(MyClass(5)); // 正确,显式转换
return 0;
}
添加了explicit
关键字后,现在编译器将不会自动将5
转换为MyClass
对象,上面的代码在尝试隐式转换时会导致编译错误。要调用functionTakingMyClass
,你必须显式地构造一个MyClass
对象。
explicit
关键字通常用于防止隐式转换可能导致的意外错误,使得类的使用更加安全和清晰。在现代C++编程中,建议尽可能使用explicit
来修饰只接受一个参数的构造函数,除非你有明确的理由需要构造函数能够进行隐式转换。
相关推荐
第1章 认识对象
1.面向对象分析(object-oriented analysis,OOA)的主要任务是分析问题域中的对象、对象之间的关系,然后构造出该问题域的分析模型。分析
C++标准每5年会有一个新版本,1998年的C++98、2003年的C++03、2007年的C++TR1、2011年的C++11.
转换操作符
static_ca
组织和策略问题第0条 不要拘泥于小节(了解哪此东本西不应该标准化)
编程规范不应施加个人喜好或者过时的做法。第1条 在高警告级别干净利落地进行编译
一、概述
GCC一般包括预处理、编译、组装和链接。GCC的运行一般是调用命令gcc,在cross-compiling时使用machine-gcc或machine-gcc-version,在使用c++时