在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。

explicit使用注意事项:

explicit 关键字只能用于类内部的构造函数声明上。

explicit 关键字作用于单个参数的构造函数。

隐式转换:直接将一种类型赋值给另外一个类型;

例如:string strType = “123”;

object objType=strType;//,隐式转换,

显示转换:数据先进行类型转换再进行赋值,

例如:string strType = “123”;

object objType=(object)strType;//,显式转换,

**例子:
***转自:***

http://www.cnblogs.com/this-543273659/archive/2011/08/02/2124596.html


未加explicit时的隐式类型转换 1. class Circle
2. {
3. public:
4. Circle(double r) : R(r) {}
5. Circle(int x, int y = 0) : X(x), Y(y) {}
6. Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}
7. private:
8. double R;
9. int X;
10. int Y;
11. };
12.
13. int _tmain(int argc, _TCHAR* argv[])
14. {
15. //发生隐式类型转换
16. //编译器会将它变成如下代码
17. //tmp = Circle(1.23)
18. //Circle A(tmp);
19. //tmp.~Circle();
20. Circle A = 1.23;
21. //注意是int型的,调用的是Circle(int x, int y = 0)
22. //它虽然有2个参数,但后一个有默认值,任然能发生隐式转换
23. Circle B = 123;
24. //这个算隐式调用了拷贝构造函数
25. Circle C = A;
26.
27. return 0;
28. } 加了explicit关键字后,可防止以上隐式类型转换发生 1. class Circle
2. {
3. public:
4. explicit Circle(double r) : R(r) {}
5. explicit Circle(int x, int y = 0) : X(x), Y(y) {}
6. explicit Circle(const Circle& c) : R(c.R), X(c.X), Y(c.Y) {}
7. private:
8. double R;
9. int X;
10. int Y;
11. };
12.
13. int _tmain(int argc, _TCHAR* argv[])
14. {
15. //一下3句,都会报错
16. //Circle A = 1.23;
17. //Circle B = 123;
18. //Circle C = A;
19.
20. //只能用显示的方式调用了
21. //未给拷贝构造函数加explicit之前可以这样
22. Circle A = Circle(1.23);
23. Circle B = Circle(123);
24. Circle C = A;
25.
26. //给拷贝构造函数加了explicit后只能这样了
27. Circle A(1.23);
28. Circle B(123);
29. Circle C(A);
30. return 0;
31. } **

C++笔记之关键字explicit的更多相关文章

  1. 关键字explicit

    今天在<C++ Standard Library>中看到 explicit 的作用,在这里做一下笔记,以备下次再次忘记该关键字的作用. By using the keyword expli ...

  2. TIJ读书笔记05-this关键字

    TIJ读书笔记05-this关键字 概述 this的用法 static方法 概述 两个对象同时调用一个方法,那么jvm怎么知道是哪个方法调用的呢. 我们在书写的时候会写成a.fun(1) 或者b.fu ...

  3. C++关键字 explicit

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

  4. C++ 关键字 explicit, export, mutable

    转自 explicit 如果A类有某个构造函数的单个输入参数,是B类(包括基本数据类型)的对象或引用,则C++的编译器会在需要A类形参的函数调用中,自动调用该构造函数,将B类实参隐式地转换为A类实参. ...

  5. Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

    最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前 ...

  6. C# 显式转换关键字 explicit

    不同于隐式转换,显式转换运算符必须通过转换的方式来调用. 如果转换操作会导致异常或丢失信息,则应将其标记为 explicit. 这可阻止编译器静默调用可能产生意外后果的转换操作. 省略转换将导致编译时 ...

  7. c/c++拷贝构造函数和关键字explicit

    c/c++拷贝构造函数和关键字explicit 关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象:不加就可以隐式初始化对象: 下面的代码是可以正常编译执行的,但 ...

  8. 从Qt谈到C++(一):关键字explicit与隐式类型转换

    转载:果冻虾仁 提出疑问 当我们新建了一个Qt的widgets应用工程时.会自动生成一个框架,包含了几个文件. 其中有个mainwindow.h的头文件.就是你要操纵的UI主界面了.我们看看其中的一段 ...

  9. Java笔记 —— this 关键字

    Java笔记 -- this 关键字 h2{ color: #4ABCDE; } a{ color: blue; text-decoration: none; } a:hover{ color: re ...

随机推荐

  1. js清除childNodes中的#text(选项卡中会用到获取第一级子元素)

    我们一般为了代码整洁代码都会换行,如上面所述. 获取div1节点下的childNodes var div = document.getElementById('div1') var child = d ...

  2. css浮动与清除浮动

    css浮动 首先,我们要知道,css中块级元素在页面中是独占一行的,自上而下排列,也就是我们所说的流,通常称为标准流. 以div为例,div是块级元素,如下: 可以清楚地看到,div是独占一行的,di ...

  3. Win10外包公司(长年承接Win10App外包、Win10通用应用外包)

    在几天前的WinHEC大会中,微软特意在大会中展示了其对通用应用的称呼规范,现在,适用于Windows通用平台的应用的正式名称为“Windows应用”(Windows apps),简洁明了. 总而言之 ...

  4. java native用法

    说明: native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中.Java语言本身不能对操作系统底层进行访问和操作,但是可以通过J ...

  5. MySQL存储过程 CASE语句

    MySQL存储过程  CASE语句 除了IF语句,MySQL提供了一个替代的条件语句CASE. MySQL CASE语句使代码更加可读和高效. CASE语句有两种形式:简单的搜索CASE语句. 简单C ...

  6. 三个水杯——java,广度优先搜索

    题目如下: 21-三个水杯 内存限制:64MB 时间限制:1000ms 特判: No通过数:51 提交数:137 难度:4 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个 ...

  7. SpringBoot关于SpringDataJpa中findOne()方法报错问题

    问题描述: 首先用的SpringDataJPA的1.11版本,可以使用findOne()方法根据id查询 然后我使用了2.0.5版本,发现findOne()方法报错了,不能用来当作根据id查询了. 当 ...

  8. 怎样使用md命令一次建立多级子目录

    https://jingyan.baidu.com/article/37bce2be30cae21002f3a224.html 点击开始,运行,在运行窗口中输入“cmd”.   打开cmd窗口之后,用 ...

  9. IDEA常用操作

    ctrl+tab:切换不同的tab Ctrl+D:比较两个目录或文件(先选中) Alt+斜杠 :智能感知提示单词 Ctrl+K :版本修改记录 Alt+Enter:正则检查 Ctrl+Alt+B:查找 ...

  10. 磁盘当前目录下存在文件 c1.txt,其中存放了一段英文文字。请编程实现将c1.txt中英文文字全部转换为答谢字母,并保存到c2.txt中。要求:c2.txt文件前面保存的是c1.txt文案中的原始文字,后面紧跟着的是转换后的文字

    #include"stdio.h"#include"string.h" void main(){ FILE *fp1,*fp2; char ch[1000]=& ...