[转载]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 ...
随机推荐
- 密码加SALT原理
原来这个技术叫SALT,以前我们经常这么用 ============================================================================== ...
- ABAP 内表的行列转换-发货通知单-打印到Excel里-NEW-(以运单号为单位显示ALV然后保存输出)
*********************************************************************** * Title : ZSDF003 ...
- JSP题库
一. 填空题 一个完整的JSP页面是由普通的HTML标记.JSP指令标记.JSP动作标记. 变量声明 与方法声明 .程序片 .表达式 . 注释 7种要素构成. JSP页面的基本构 ...
- java课后作业 弹出窗口求两个数的加减乘除
//计算2个数的加减乘除 谷伟华 2015/10/6package jisuan; import javax.swing.JOptionPane; public class Jiasuan { pub ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(三) 之 实现单聊,群聊,发送图片,文件。
上篇讲解了如何搭建聊天服务器,以及客户端js怎么和layui的语法配合.服务器已经连接上了,那么聊天还会远吗? 进入正题,正如上一篇提到的我们用 Client.Group(groupId)的方法向客户 ...
- Loadrunner之API测试
//API函数 web_submit_data web_custom_request //支持https请求 web_set_sockets_option("SSL_VERSION&qu ...
- 二、JavaScript语言--事件处理--DOM事件探秘
第一章 事件流 事件:是文档或浏览器窗口中发生的.特定的交互瞬间.JavaScript和HTML之间的交互都是通过事件来实现的. 事件流:描述的是从页面中接受事件的顺序 IE:事件冒泡流 Netsca ...
- Jmeter测试JDBC
Datebase Driver class Database URL MySQL com.mysql.jdbc.Driver jdbc:mysql://host:port/{dbname} Postg ...
- php PDO:数据访问抽象层
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- windows 远程桌面命令 mstsc
win+R------>mstsc: 弹出: 目标机必开远程