explicit关键字

C++中的关键字explicit主要是用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。类构造函数默认情况下声明为隐式的即implicit。

隐式转换即是可以由单个实参来调用的构造函数定义了一个从形参类型到该类类型的隐式转换。编译器在试图编译某一条语句时,如果某一函数的参数类型不匹配,编译器就会尝试进行隐式转换,如果隐式转换后能正确编译,编译器就会继续执行编译过程,否则报错。

explicit关键字只能用于类内部的构造函数声明上,而不能用在类外部的函数定义(函数实现)上,它的作用是不能进行隐式转换;explicit关键字作用于单个参数的构造函数,如果构造函数有多个参数,但是从第二个参数开始,如果各参数均有默认赋值,也可以应用explicit关键字。

当构造函数只有一个参数时,会进行自动隐式转换,当构造函数参数个数超过或等于两个时自动取消隐式转换,当只有一个必须输入的参数,其余的为有默认值的参数时使用explicit也起作用。

一般只将有单个参数的构造函数声明为explicit,而拷贝构造函数不要声明为explicit。

explicit关键字只能对用户自己定义的对象起作用,不对默认构造函数起作用。此关键只能够修饰构造函数。无参数的构造函数和多参数的构造函数总是显示调用,这种情况在构造函数前加explicit无意义。

当不希望进行自动类型转换时用explicit,标准库的许多构造函数都是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 t3(12); //显式调用成功

return 0;

}

Test1的构造函数带一个int型的参数,代码19行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码20行会出现编译错误。

普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。

本文参考其他博客,仅供学习。

转载于:https://www.cnblogs.com/zhougong/p/8869791.html

C++学习一explicit相关推荐

  1. 侯捷C++学习记录-面向对象高级编程下

    本章谈到三大函数.stack堆.heap栈和内存管理. new 操作 与 delete 操作,最后对String类实现进行复习. 学习static 关键字及类模板涉及到的设计模式有:单例模式.Adap ...

  2. C++ 中explicit关键字详解

    展开 explicit关键字的作用 使用情况 类型转换函数 单操作数构造函数 同时出现拷贝构造函数和类型转换函数 拷贝构造函数 总结 参考文献 explicit关键字的作用 explicit关键字在写 ...

  3. 终极人机大战要来了?AI打星际2即将直播,DeepMind暴雪发出神秘预告

    乾明 岳排槐 发自 凹非寺 量子位 出品 | 公众号 QbitAI 要出大事了. 刚刚,DeepMind和暴雪联合宣布,北京时间周五凌晨2点,公开展示AI打<星际争霸II>(下称星际2)的 ...

  4. 40隐式构造函数和隐式转换,还有explicit关键词的确切含义【C++学习笔记】

    40隐式构造函数和隐式转换,还有explicit关键词的确切含义 隐式的意思是:不会明确地告诉你它要做什么,它有点像在某种情况下自动的工作 隐式转换 double a = 0.5; int b = a ...

  5. C++学习(八十四)explicit和implicit

    在编程过程中, 我们习惯上使用explicit或者implicit关键字实现构造函数的显式或者隐式显示. explicit关键字:只能修饰只有一个参数的构造函数,或者有多个参数,但是除第一个参数外其他 ...

  6. 《ABAQUS 6.14超级学习手册》——1.2 ABAQUS分析模块

    本节书摘来自异步社区<ABAQUS 6.14超级学习手册>一书中的第1章,第1.2节,作者: 齐威 更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.2 ABA ...

  7. pytorch与keras_Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者

    pytorch与keras by Patryk Miziuła 通过PatrykMiziuła Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者 (Keras vs PyTorch ...

  8. 常惠琢 201771010102《面向对象程序设计(java)》第七周学习总结

    实验七 继承附加实验 实验时间 2018-10-11 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: (2)掌握Object类的常用API用法: (3)掌握ArrayList类用法 ...

  9. Github标星24k,127篇经典论文下载,这份深度学习论文阅读路线图不容错过

    作者  | Floodsung 翻译 | 黄海广 来源 | 机器学习初学者(ID:ai-start-com) [导读]如果你是深度学习领域的新手,那么你可能会遇到的第一个问题是"我应该从哪篇 ...

  10. 必看,61篇NeurIPS深度强化学习论文解读都这里了

    作者 | DeepRL 来源 | 深度强化学习实验室(ID: Deep-RL) NeurIPS可谓人工智能年度最大盛会.每年全球的人工智能爱好者和科学家都会在这里聚集,发布最新研究,并进行热烈探讨,大 ...

最新文章

  1. Android2.3解析json出错
  2. cambridge map
  3. linux 下停止监听程序,Linux下启动Oracle服务和监听程序步骤
  4. Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ
  5. import sys是什么意思_学了半天,import 到底在干啥?
  6. spring boot jpa SQL语句注意事项
  7. 健身 赚钱 ; 旅行 用心爱一个人就行了 其他的都会开挂来临~
  8. mysql数据库中的分组查询语句_详解MySQL中的分组查询与连接查询语句
  9. npm下载webpack时常见错误解决办法
  10. word标题在大纲视图下统一升降级
  11. Android之shape属性设置
  12. 解决IEM被禁用的问提
  13. (附源码)php柘城农产品销售系统 毕业设计020832
  14. 地球人口承载力估计【小学奥数7653】
  15. OSChina 周日乱弹 ——我是胖娜丽莎
  16. 福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
  17. Win2k高级技巧 -----引用至某BLOG.保存了很久了.
  18. 华为云讲解:2. Istio Pilot 与服务发现
  19. Oracle数据库:随机查询100条数据
  20. 苹果11自带测试软件,9款旗舰系统对比 iPhone 11居然不是最好用的

热门文章

  1. 一个简单的txt读取与导出
  2. 【渝粤教育】广东开放大学 外国文学专题 形成性考核 (55)
  3. 机器博弈 (二) 遗憾最小化算法
  4. 从设计门禁系统到为何需要弱电与强电分开呢?
  5. python学习笔记之读取配置文件【转自https://my.oschina.net/u/3041656/blog/793467】
  6. P2158 [SDOI2008]仪仗队 欧拉函数
  7. [朴素妍][뭐라고 끝낼까][说什么结束]
  8. bzoj 1072: [SCOI2007]排列perm
  9. requests-get请求
  10. [转]Microsoft SQL Server Management Studio Express 使用SQL验证登录sa