关闭

C++ explicit关键字(隐式转换)

503人阅读 评论(0) 收藏 举报
分类:

转自:http://www.programlife.net/cpp-explicit-keyword.html

第一次遇见explicit,那是在《The C++ Standard Library》里面,全然不明白什么意思。如今,这本书已经翻完了,看起了《Generic Programming And Standard Templete Library》,感觉看后台实现比前台应用好玩多了,但是看GP&STL还是需要一定基础的,我只好又翻起了《C++ Primer》。这次再次遇到explicit,该做个了断了。

其实explicit主要用于防止隐式转换,用于修饰构造函数、复制构造函数。比如,下面的代码编译不会出错:

#include <iostream>
using namespace std;

class Demo
{
private:
	int value;
public:
	Demo():value(0){}
	Demo(int val):value(val){}
	Demo(const Demo& d):value(d.value){}
};

int main()
{
	Demo d = 1;
	Demo dd = d;
	
	return 0;
}

Demo d = 1会这样运行:通过将1传递给单个形参构造函数,用这个构造函数来初始化对象d。对于下一行代码,通过将d传递给复制构造函数,来初始化dd。这些隐式调用都是自动完成的。有时候运行的很好,但是也有的时候会造成出乎意外的结果。能不能防止隐式调用呢?可以的。explicit就是用作这个用途的。当在构造函数和复制构造函数前面都加上explicit时,编译就会出错,下面的写法才是正确的:

#include <iostream>
using namespace std;

class Demo
{
private:
	int value;
public:
	Demo():value(0){}
	//explicit能防止以赋值语法带有转型操作的初始化
	explicit Demo(int val):value(val){}
	explicit Demo(const Demo& d):value(d.value){}
};

int main()
{
	//Demo d = 1;	//构造函数加上explicit时错误
	Demo d(10);
	//Demo dd = d;	//赋值构造函数加上explicit时错误
	Demo dd(d);
	
	return 0;
}

0
0

猜你在找
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【套餐】深度学习入门视频课程——唐宇迪
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】计算机视觉原理及实战——屈教授
【直播】机器学习之凸优化——马博士
【直播】机器学习&数据挖掘7周实训--韦玮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:130153次
    • 积分:1745
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:116篇
    • 译文:0篇
    • 评论:12条
    最新评论