explicit的作用
在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的作用相关推荐
- 原来... C++ explicit的作用
原来... C++ explicit的作用 explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转 ...
- C++ explicit的作用
explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: * e ...
- C++ 中explicit的作用及用法(虽然简单,但是还是有用的)
目录 C++explicit(官网的说法) explicit specifier C++explicit 清楚的说法(建议英文不好的从这里开始食用哦) explicit作用: explicit使用注意 ...
- 关键字explicit的作用(转)
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况 ...
- C++11 explicit关键字的作用
explicit 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换.因为无参构造函数和多参构造函数本身就是显示调用 ...
- explicit关键字的作用
explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: exp ...
- C++中的explicit关键字介绍
C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换.类构造函数默认情况下声明为隐式的即implicit. 隐式转 ...
- c++中的explicit关键字
2007-05-11 14:42:00 | 作者: Admin ] c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有&quo ...
- 【c++】【转】c++中的explicit关键字
http://www.cnblogs.com/chio/archive/2007/09/17/895263.html c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式(调用) ...
最新文章
- jna 不是有效的 win32 应用程序_教你打开程序提示不是有效的win32程序怎么办
- Python基础概念_13_常见关键字
- 5.0:Spring-bean的加载
- 【机器视觉】 endfor算子
- Windows使用opencv训练模型过程记录(提供样本)
- 如何在MaxCompute中利用bitmap进行数据处理?
- python3软件怎么使用_python3怎么使用pip
- Redis配置文件redis.config详解以及关闭Redis服务
- OpenCV初探 —— VS2019配置环境
- 头的各个部位示意图_图解圆锥破碎机润滑油路,7个主要润滑部位特点分析
- 正常网页开发如何解除父容器中子容器的浮动问题
- OpenGL ES着色器语言之变量和数据类型(一)(官方文档第四章)和varying,uniform,attribute修饰范围...
- VMware安装Windows Server 2003提示Operating System not found
- 2.3,2.2,2.1最新谷歌服务包发布附下载(原创)
- python导入数据画折线图_Python学习第93课-导入csv数据并绘制折线图
- 恐怖的广告推送。其实,我们每天都在“裸奔”!
- 如何用手机快捷设计品牌宣传的海报图片和视频
- 如何应对VB中对象库注册失败(MSCOMCTL.OCX)
- python excel xlwngs 受保护的视图解除方法
- Java 生成二维码 zxing生成二维码 条形码 服务端生成二维码 Java生成条形码
热门文章
- 我的世界mysql插件_MySQL Inventory Bridge — 跨服背包[1.7-1.15]【Bukkit】
- Linux signal、sigaction的使用总结
- C++ 进程与线程---CreateProcess()函数(1)
- 颜值爆表!Redis 官方客户端工具,功能强大,且支持可视化监控!
- 云计算之概念——IaaS、SaaS、PaaS、Daas
- Java架构师需要哪些知识?
- 希尔伯特变换(Hilbert Transform)
- python print 字体大小_Python print 玩转“点阵字”
- 呀,葵花宝典![IT项目经理成长晋升记2]
- monkeyrunner的使用