[转载]explicit关键字
本文转自http://www.programlife.net/cpp-explicit-keyword.html。
其实explicit主要用于防止隐式转换,用于修饰构造函数、复制构造函数[注意:一般推荐对构造函数使用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 dd = d; //复制构造函数加上explicit时错误
Demo d(1); //构造函数加不加explicit都没有问题
Demo dd(d); //复制构造函数加不加explicit都没有问题
return 0;
} 还有一篇帖子说的比较详细:
先说说用构造函数作为隐式转换函数。在C++中,凡是一个类有只带一个参数的构造函数,都定义了一组隐式转换,把构造函数的参数类型转换为该class的类型。比如Integer(int)就定义了一个从int到Integer类型的隐式转换。比如,对于以下代码:
extern void calc( Integer );
int i;calc( i );
如果Integer类没有声明一个Integer(int)的构造函数,编译器将在calc(i)处报错。相反如果Integer类声明了一个Integer(int)型的构造函数,那么int值可以被用在任何需要Integer类型的地方。
如果我们不期望编译器自动的进行这种隐式转换,该怎么办呢?有一种解决办法,就是把它声明为显式的(explicit):
class Integer {
public:
explicit Integer( int );
// ...
};
这样当编译到隐式的类型转换时,编译器将报错,说明不能执行隐式转换。我们可以使用强制转换的形式显式的执行转换操作,如:
extern void func( Integer );
int main() {
func(99); //错误,从int到Integer没有隐式转换
func(Integer(99)); //OK,显式转换
func(static_cast<Integer>(99)); //OK,强制转换
};
[转载]explicit关键字的更多相关文章
- C++ explicit关键字详解(转载)
转载:https://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函 ...
- C++ explicit关键字详解
本文系转载,原文链接:http://www.cnblogs.com/ymy124/p/3632634.html 首先, C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用 ...
- C++中explicit关键字的作用
转载自:http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html explicit用来防止由构造函数定义的隐式转换. 要明白它的 ...
- C++中explicit关键字的使用
看书看到了explicit关键字,就来做个笔记,讲得比较明白,比较浅. 在C++中,我们有时可以将构造函数用作自动类型转换函数.但这种自动特性并非总是合乎要求的,有时会导致意外的类型转换,因此,C++ ...
- C++中的explicit关键字
http://www.cnblogs.com/winnersun/archive/2011/07/16/2108440.html 上面链接中的博主写的很好,我也不多说了.举得例子也很好,应该也是看了E ...
- C++ explicit关键字应用方法详解
C++编程语言中有很多比较重要的关键字在实际编程中起着非常重要的作用.我们今天为大家介绍的C++ explicit关键字就是其中一个应用比较频繁的关键字.下面就让我们一起来看看这方面的知识吧. C++ ...
- explicit关键字
C++中,explicit关键字用来修饰类只有一个参数的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: explicit 关 ...
- C++ 构造函数放置默认转换explicit关键字(2)
按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p ); ...
- C++explicit关键字
在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: * explicit ...
随机推荐
- Effective C++ -----条款51:编写new 和delete 时需固守常规
operator new 应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler.它也应该有能力处理0 bytes 申请.Class专属版本则还应该处理“比 ...
- Effective C++ -----条款24:若所有参数皆需类型转换,请为此采用non-member函数
如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.
- 【leetcode】Excel Sheet Column Title & Excel Sheet Column Number (easy)
Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...
- xcode7 免费真机调试
原文链接:http://www.cnblogs.com/tandaxia/p/4839997.html 刚新安装了Xcode7 Version 7.1 beta , 据说这个版本可以免费真机调试,于是 ...
- [Android Pro] Java进阶学习:jar打包详解
jar文件听说过吗,没有?或者陌生!好,没关系,这就是我们的第一站:打包发布. 为什么会有这个玩意呢,首先,这是jar的全称:JavaTM Archive (JAR) file,是的,就是java存档 ...
- 最小集合(51nod 1616)
A君有一个集合. 这个集合有个神奇的性质. 若X,Y属于该集合,那么X与Y的最大公因数也属于该集合. 但是他忘了这个集合中原先有哪些数字. 不过幸运的是,他记起了其中n个数字. 当然,或许会因为过度紧 ...
- 靶形数独(codevs 1174)
1174 靶形数独 2009年NOIP全国联赛提高组 时间限制: 4 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descri ...
- c#三层架构登陆实例
很早之前,就听说过三层结构了.当时只知道 三层结构 是把 系统的 界面 跟 数据库操作等不相关的程序分别开来.原来这么简单的实现,确实传说中的 三层结构啊. 首先,先来看一下是哪三层.表示层(UI, ...
- C 工厂模式 还有其他的模式
http://blog.csdn.net/feixiaoxing/article/details/7081243
- DB2应用中嵌入式SQL取值入本地变量
Declare section for host variables in C and C++ embedded SQL applications You must use an SQL declar ...