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++关键字explict的详解和使用

在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。 explicit使用注意事项:     *     exp...
  • cbNotes
  • cbNotes
  • 2014年09月25日 14:00
  • 7113

C++中的explicit作用功能(防止隐式转换)

C++中的explicit C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。 C++中, 一...
  • SprintfWater
  • SprintfWater
  • 2013年04月03日 18:44
  • 1448

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

c++中的explicit关键字及隐式类型转换 c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而...
  • lord_is_layuping
  • lord_is_layuping
  • 2013年06月10日 22:44
  • 1165

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

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

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

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

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

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

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

explicit在C++学习中应该会遇到,但是实际项目开发中
  • wu_123_456
  • wu_123_456
  • 2014年08月02日 11:12
  • 567

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

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

explicit 显示转换 (不允许隐式转换)

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { pubilc: String ( con...
  • qq_31821675
  • qq_31821675
  • 2017年03月17日 14:05
  • 86

声明时候构造函数前加explicit -防止构造函数参数的隐式转换

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char*...
  • yangguangmeng
  • yangguangmeng
  • 2014年05月09日 10:00
  • 506
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ explicit关键字(隐式转换)
举报原因:
原因补充:

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