在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性,我想在有些时候这种特性将会非常有用。
按默认规定,只用传一个参数的构造函数也定义了一个隐式转换。举个例子:
(下面这个CExample没有什么实际的意义,主要是用来说明问题)

//Example.h
#pragma once
class CExample
{
public:
CExample(void);
public:
~CExample(void);
public:
int m_iFirst;
int m_iSecond;
public:
CExample(int iFirst, int iSecond = 4);
};
//Example.cpp
#include "StdAfx.h"
#include "Example.h"
CExample::CExample(void)
: m_iFirst(0)
{
}
CExample::~CExample(void)
{
}
CExample::CExample(int iFirst, int iSecond):m_iFirst(iFirst), m_iSecond(iSecond)
{
}

//TestExplicitKey.cpp
…//其它头文件

#include "Example.h"
int _tmain(int argc, _TCHAR* argv[])
{
CExample objOne; //调用没有参数的构造函数
CExample objTwo(12, 12); //调用有两个参数的构造函数
CExample objThree(12); //同上,可以传一个参数是因为该构造函数的第二个参数有默认值
CExample objFour = 12; //执行了隐式转换,等价于CExample temp(12);objFour(temp);注意这个地方调用了
//编译器为我们提供的默认复制构造函数
return 0;
}

如果在构造函数声明中加入关键字explicit,如下
explicit CExample(int iFirst, int iSecond = 4);
那么CExample objFour = 12; 这条语句将不能通过编译。在vs05下的编译错误提示如下
error C2440: ‘initializing’ : cannot convert from ‘int’ to ‘CExample’
Constructor for class ‘CExample’ is declared ‘explicit’
对于某些类型,这一情况非常理想。但在大部分情况中,隐式转换却容易导致错误(不是语法错误,编译器不会报错)。隐式转换总是在我们没有察觉的情况下悄悄发生,除非有心所为,隐式转换常常是我们所不希望发生的。通过将构造函数声明为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,这样可以大大减少错误的发生。

explicit的作用相关推荐

  1. 原来... C++ explicit的作用

    原来... C++ explicit的作用 explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转 ...

  2. C++ explicit的作用

    explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: * e ...

  3. C++ 中explicit的作用及用法(虽然简单,但是还是有用的)

    目录 C++explicit(官网的说法) explicit specifier C++explicit 清楚的说法(建议英文不好的从这里开始食用哦) explicit作用: explicit使用注意 ...

  4. 关键字explicit的作用(转)

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

  5. C++11 explicit关键字的作用

    explicit 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换.因为无参构造函数和多参构造函数本身就是显示调用 ...

  6. explicit关键字的作用

    explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: exp ...

  7. C++中的explicit关键字介绍

    C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换.类构造函数默认情况下声明为隐式的即implicit. 隐式转 ...

  8. c++中的explicit关键字

    2007-05-11 14:42:00 | 作者: Admin ] c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有&quo ...

  9. 【c++】【转】c++中的explicit关键字

    http://www.cnblogs.com/chio/archive/2007/09/17/895263.html c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式(调用) ...

最新文章

  1. jna 不是有效的 win32 应用程序_教你打开程序提示不是有效的win32程序怎么办
  2. Python基础概念_13_常见关键字
  3. 5.0:Spring-bean的加载
  4. 【机器视觉】 endfor算子
  5. Windows使用opencv训练模型过程记录(提供样本)
  6. 如何在MaxCompute中利用bitmap进行数据处理?
  7. python3软件怎么使用_python3怎么使用pip
  8. Redis配置文件redis.config详解以及关闭Redis服务
  9. OpenCV初探 —— VS2019配置环境
  10. 头的各个部位示意图_图解圆锥破碎机润滑油路,7个主要润滑部位特点分析
  11. 正常网页开发如何解除父容器中子容器的浮动问题
  12. OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围...
  13. VMware安装Windows Server 2003提示Operating System not found
  14. 2.3,2.2,2.1最新谷歌服务包发布附下载(原创)
  15. python导入数据画折线图_Python学习第93课-导入csv数据并绘制折线图
  16. 恐怖的广告推送。其实,我们每天都在“裸奔”!
  17. 如何用手机快捷设计品牌宣传的海报图片和视频
  18. 如何应对VB中对象库注册失败(MSCOMCTL.OCX)
  19. python excel xlwngs 受保护的视图解除方法
  20. Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码

热门文章

  1. 我的世界mysql插件_MySQL Inventory Bridge — 跨服背包[1.7-1.15]【Bukkit】
  2. Linux signal、sigaction的使用总结
  3. C++ 进程与线程---CreateProcess()函数(1)
  4. 颜值爆表!Redis 官方客户端工具,功能强大,且支持可视化监控!
  5. 云计算之概念——IaaS、SaaS、PaaS、Daas
  6. Java架构师需要哪些知识?
  7. 希尔伯特变换(Hilbert Transform)
  8. python print 字体大小_Python print 玩转“点阵字”
  9. 呀,葵花宝典![IT项目经理成长晋升记2]
  10. monkeyrunner的使用