文档章节

C++ 中的 explicit 关键字

i
 iblackangel
发布于 2017/04/27 09:23
字数 477
阅读 12
收藏 0

引言

在 C++ 程序中很少有人去使用 explicit 关键字,不可否认,在平时的实践中确实很少能用得上。但稍微留心一下就会发现现有的 MFC 库或者 C++ 标准库中的相关类声明中 explicit 出现的频率是很高的。了解 explicit 关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然 C++ 语言提供这种特性,我想在有些时候这种特性将会非常有用。

目的

通过将构造函数声明为 explicit(显式)的方式可以抑制隐式转换。也就是说,explicit 构造函数必须显式调用。

例子

引用 Bjarne Stroustrup 的例子:

class String{
      explicit String(int n);
      String(const char *p);
};

String s1 = 'a';         //错误:不能做隐式char->String转换
String s2(10);           //可以:调用explicit String(int n);
String s3 = String(10);  //可以:调用explicit String(int n);再调用默认的复制构造函数
String s4 = "Brian";     //可以:隐式转换调用String(const char *p);再调用默认的复制构造函数
String s5("Fawlty");     //可以:正常调用String(const char *p);

void f(String);

String g()
{
    f(10);               //错误:不能做隐式int->String转换
    f("Arthur");         //可以:隐式转换,等价于f(String("Arthur"));
    return 10;           //同上
}

在实际代码中的东西可不像这种故意造出的例子。
发生隐式转换,除非有心利用,隐式转换常常带来程序逻辑的错误,而且这种错误一旦发生是很难察觉的。
原则上应该在所有的构造函数前加 explicit 关键字,当你有心利用隐式转换的时候再去解除 explicit,这样可以大大减少错误的发生。

class ClassName
{
    explicit ClassName(int args);
	virtual ~ClassName();
};

参考资料

[1] C++ 中的 explicit 关键字

本文转载自:http://blog.csdn.net/chollima/article/details/3486230

i
粉丝 0
博文 47
码字总数 14784
作品 0
广州
程序员
私信 提问
C++ explicit关键字详解

首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况...

天王盖地虎626
07/02
5
0
VS2013中的C++11新特性

介绍 Visual C++ 2013 Preview 在6月发布了,C++开发者又找到一个编译器可以更好的支持ISO C++ 11 的特性了.本文介绍了这些新的特性并附有代码实例. 你想动手尝试编译文中的这些代码话,需要去...

疙瘩
2013/07/23
38.8K
42
vim中实现qt的语法高亮

我们知道用Vim打开一个文件的时候,会根据文件的格式自动进行语法高亮。当我们打开一个Qt4写的.cpp文件时,vim会将它当作一个普通的.cpp文件来对待,如果我们希望Qt中对应的类和关键字也能被...

xiangxw
2010/12/01
1K
0
ANSI C++特征总结

随着C++的普及,标准的指定成了C++发展的必然趋势。而制订此一标准的工作是由ANSI (American National Standards Institute,美国标准学会)与ISO (International Standardization Organiz...

NILYANG
2009/06/01
114
0
QT5中实现多窗口切换,并从子窗口返回数据

该程序的功能:主窗口里有两个button和ltextEdit,按下下一页button后弹出子窗口并隐藏主窗口,按下退出Button后退出程序。子窗口有文本框lineEdit和button,按下子窗口的button后,会向主窗...

shzwork
09/19
15
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
14
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
9
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
91
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部