explicit关键字
阅读数:317 评论数: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++初步认识
C++对C的“增强”,表现在两个方面:
(1)在原来面向过程的机制基础上,对C语言的功能做了不少扩展
(2)增加了面向对象的机制
面向对象和面向过程不是矛盾的,而是各有用途
C++标准每5年会有一个新版本,1998年的C++98、2003年的C++03、2007年的C++TR1、2011年的C++11.
转换操作符
static_cast
将一个值以符合逻辑的方式转型。这
组织和策略问题
第0条 不要拘泥于小节(了解哪此东本西不应该标准化)
编程规范不应施加个人喜好或者过时的做法。
第1条 在高警告级别干净利落地进行编译
高度重视警告:使用编译器的最高警告级别。应该要求
1、C++版本更迭
年份
C++标准
通用名
别名
标准编译选项
GNU扩展选项
1978
C with Classes
-
-
-
-
1998
ISO/IEC 14882:199
1、转换操作
(1)static_cast
将一个值以符合逻辑的方式转型。这个可以看作是“利用原值重建一个临时对象,并在设立初值时使用型别转换”。唯有当上述型别转换有所定义时,整个转换才会成功。
如:
一、概述
GCC一般包括预处理、编译、组装和链接。GCC的运行一般是调用命令gcc,在cross-compiling时使用machine-gcc或machine-gcc-version,在使用c++时