C++ 中explicit的使用

C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。

C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。
所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。
这样看起来好象很酷, 很方便。 但在某些情况下(见下面权威的例子), 却违背了我们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用,使用, 不能作为类型转换操作符被隐含的使用。 呵呵, 看来还是光明正大些比较好。
explicit构造函数的作用
解析:
explicit构造函数是用来防止隐式转换的。请看下面的代码:
class Test1
{
public:Test1(int n){num=n;}//普通构造函数
private:int num;
};
class Test2
{
public:explicit Test2(int n){num=n;}//explicit(显式)构造函数
private:int num;
};
int main()
{Test1 t1=12;//隐式调用其构造函数,成功Test2 t2=12;//编译错误,不能隐式调用其构造函数Test2 t2(12);//显式调用成功return 0;
}
Test1的构造函数带一个int型的参数,代码23行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码24行会出现编译错误。
普通构造函数能够被隐式调用。而explicit构造函数只能被显式调用。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259494.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BZOJ 1026 windy数 (数位DP)

题意 区间[A,B]上,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数? 思路 状态设计非常简单,只需要pos、limit和一个前驱数pre就可以了,每次枚举当前位时判断是否与上一位相差2即可。一个需要注意的地方是第一位不用比较…

oracle诊断,Oracle 诊断事件列表

Oracle 诊断事件列表(2013-03-26 18:05:26)标签:oracle诊断事件itORA-10000: controlfile debug event, name control_fileORA-10001: controlfile crash event1ORA-10002: controlfile crash event2ORA-10003: controlfile crash event3ORA-10004: controlfile cra…

考研数学:【以错补错】 降低做题出错率

考研数学:以错补错 降低做题出错率  众所周知,数学需要做题,需要通过做题来巩固掌握,但很多同学却陷入了题海战术,把所有的精力都放在数学练习上,一门心思做题,可几个月下来却没有进展&#x…

treeview右键添加新节点

private void advTree1_MouseDown(object sender, MouseEventArgs e){if (e.Button MouseButtons.Right)//判断你点的是不是右键{Point ClickPoint new Point(e.X, e.Y);Node CurrentNode advTree1.GetNodeAt(ClickPoint);if (CurrentNode ! null)//判断你点的是不是一个节点…

RPM方式安装MySQL5.6

RPM方式安装MySQL5.6 rpm -ivh MySQL-server-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-client-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-devel-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -ivh MySQL-embedded-5.6.25-1.linux_glibc2.5.x86_64.rpm rpm -iv…

centos7静默搭建oracle11g,Linux静默安装Oracle方法(centos7+oracle11g)

1、 增加虚拟内存ddif/dev/zero of/swapadd bs1024 count2006424mkswap /swapaddswapon /swapadd2、 检查依赖包rpm -q binutils compat-libstdc-33 elfutils-libelf elfutils-libelf-devel gcc gcc-c glibc-2.5 glibc-common glibc-devel glibc-headers ksh libaio libaio-dev…

Ms SQL Server 约束和规则

一、SQL约束 约束定义关于列中允许值的规则,是强制完整性的标准机制。 使用约束优先于使用触发器、规则和默认值。查询优化器也使用约束定义生成高性能的查询执行计划。 1:类型 约束的类型一共分三种 域约束: 涉及一个或多个列&#xf…

Qt 独立运行时伴随CMD命令窗口

用Qt写了一个小软件,在把程序release后,打包分装后,发现程序运行的时候会伴随cmd命令窗口,可把我愁怀了 不过功夫不负有心人,在老师和我网友的帮助下,终于搞完了 CONFIG:指定工程配置和编译参数…

Intellij IDEA 快捷键整理(dyCopy)

原文:http://www.cnblogs.com/tonycody/p/3257601.html【常规】CtrlShift Enter,语句完成“!”,否定完成,输入表达式时按 “!”键CtrlE,最近的文件CtrlShiftE,最近更改的文件ShiftC…

长竖线及长括号

转载:http://blog.sina.com.cn/s/blog_6005d4af0101861l.html 文章修改中要求把花括号和竖线变长,查了下发现下面的几种方法: 1.花括号“{ }”变长: $\left\{...\right\}$; 或者用 $\Big\{...\Big\}$; 2.竖线“|”变长…

php 加入日志功能,php怎么写一个日志功能的函数

我们要写一个写日志的函数,首先需要了解需求,我们一般怎么用日志函数呢?例如,程序执行到某一步,我希望把这个变量(地址)$user_address的值打印到日志,我们希望日志里是这么写的:xx-xx-xx xx:xx $user_address : 上海市杨浦区xxxxx然后每一条日志都要换行,都有日期时间,假设 函…

Ant简单工程的构建

1.在Ant的官方网站http://ant.apache.org/bindownload.cgi下载Ant最新版本(我下载的是apache-ant-1.8.2-bin.zip),Ant无需安装,直接解压后设置环境变量即可。 2.测试Ant是否安装成功,在控制台运行ant命令,出…

MVC学习四

第七节 讲述了增加model中类的属性,由于数据库中已存在表,表中没有存在新加的列,所以可以删除数据库或者在数据库中新增一列,另可以在controller中新增一个数据库初始化的类,并在Global.asax添加初始化数据库的代码 …

mysqlpump 备份文件压缩对比

mysqldump,使用single-transaction,通过管道使用gzip压缩,20G单数据库备份real8m15.291suser8m39.617ssys0m16.675s备份文件1.43Gmysqlpump,4线程,使用single-transaction,通过管道使用gzip压缩&#xff0c…

如何让Latex公式字体变小

转载:http://blog.sina.com.cn/s/blog_5e16f1770100gdxh.html 第一种方法:用比较笨的方法,一个一个公式用 \begin{small} \begin{equation} \ldots \end{equation} \end{small} 第二种方法:定义新的变量环境 在开始 \newenvironme…

php 正则表达式验证金额,php 正则表达式验证数字

非负浮点数(正浮点数 0):^d(.d)?$正浮点数 ^(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9][0-9]*))$非正浮点数(负浮点数 0) ^((-d(.d)?)|(0(.0)?))$负浮点数 ^(-(([0-9].[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9])|([0-9]*[1-9]…

ASP.NET MVC:会导致锁定的会话

背景 一直没有意识到会话的访问会导致会话锁定,现在想想这样设计是非常合理的,不过某些情况下这样会导致同一个会话的并发访问非常低(只能串行化),好在MS提供了机制让我们控制这种锁。 测试 A页面:缓存写入…

.NET重构(四):窗体继承+模板方法,完美实现组合查询

导读:在机房重构中,有好些个查询都是大同小异,最为显著的就是组合查询了。怎样给自己省事儿,相同的东西能不能重复利用,就成了一个现实的问题。第一遍做机房的时候,使用的更多的是:复制粘贴。学…

github常见操作和常见错误!错误提示:fatal: remote origin already exists.

原文链接:http://blog.csdn.net/dengjianqiang2011/article/details/9260435 如果输入$ git remote add origin gitgithub.com:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote or…

云计算的下半场

经常有人说互联网上下半场的区别,大体上上半场烧钱,下半场分出胜负。自打美团王兴抛出互联网的下半场的说法,大家意识到这不仅仅是新美大的下半场,这更是整个互联网行业的下半场。爆炸式的人口红利带来互联网行业上半场的快速增长…