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

转载 2013年12月03日 21:28:47

转自: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;
}

相关文章推荐

C++中的explicit关键字 抑制隐式转换构造

在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者...

C++中的explicit关键字 抑制隐式转换

在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者...

c++:explicit 抑制构造函数隐式转换

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char*...

C/C++日常学习总结(第十二篇)将构造函数声明为explicit(显式)的方式可以抑制隐式转换

explicit在C++学习中应该会遇到,但是实际项目开发中

C++ 隐式类型转换与关键字explicit

1.什么是类型转换 某些类型之间存在相关的依赖关系,在需要某种类型的操作数位置上,使用该类型的相关类型的值或对象. 2.什么是隐式类型转换 转换规则由编译器自动执行,无需...
  • e_wsq
  • e_wsq
  • 2014年06月18日 09:07
  • 444

explicit只对构造函数起作用,用来抑制隐式转换

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示:class String {String ( const char* p ); //...

c++中的explicit关键字及隐式类型转换

c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就...

c++中的explicit关键字及隐式类型转换

c++中的explicit关键字及隐式类型转换 c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢...

菜鸟之隐式转换(implicit)、显示转换(explicit)及转换函数(operator()const)

学习C++过程中,遇到很多数据类型的转换

JAVA隐式转换和方法重写和static关键字

author : chen ming dong 闲来无事做想玩玩JAVA了 今天碰到点困难,算是完美解决了package 类;// static用来修饰类中的变量或方法,成为静态变量,静态方法 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ explicit关键字(隐式转换)
举报原因:
原因补充:

(最多只允许输入30个字)