关键字explicit
时间:2022-04-22
本文章向大家介绍关键字explicit,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
关键字只能用在类构造函数。它的作用是不能进行隐式转换。
1 class gxgExplicit //没有关键字explicit的类
2
3 {
4
5 public:
6
7 int _size;
8
9 gxgExplicit(int size)
10
11 {
12
13 _size = size;
14
15 }
16
17 };
下面是调用
gxgExplicit gE1(24); //这样是没有问题的
gxgExplicit gE2 = 1; //这样也是没有问题的
gxgExplicit gE3; //这样是不行的,没有默认构造函数
gE1 = 2; //这样也是没有问题的
gE2 = 3; //这样也是没有问题的
gE2 = gE1; //这样也是没有问题的
但是假如gxgExplicit修改为Stack,我们的_size代表的是堆栈的大小,那么调用的第二句就显得不伦不类,而且容易让人疑惑。这并不是可以让代码阅读者明白和接受的形式,虽然它是合法的(编译器可以通过编译)。这是因为编译器默认情况下有隐式转换的功能,你输入gE2 = 1就编译成同第一句相同的结果。所以,explicit就派上了用场。修改代码为:
1 class gxgExplicit
2
3 {
4
5 public:
6
7 int _size;
8
9 explicit gxgExplicit(int size)
10
11 {
12
13 _size = size;
14
15 }
16
17 };
继续上面的调用:
gxgExplicit gE1(24); //这样是没有问题的
gxgExplicit gE2 = 1; //这样是不行的,关键字取消了隐式转换
gxgExplicit gE3; //这样是不行的,没有默认构造函数
gE1 = 2; //这样是不行的,关键字取消了隐式转换
gE2 = 3; //这样是不行的,关键字取消了隐式转换
gE2 = gE1; //这样是不行的,关键字取消了隐式转换,除非类实现操作符“=”的重载。
这是编译器(vs2005)显示:cannot convert from 'int' to 'gxgExplicit'。
从这里也就看出这个关键字的作用是将编译器隐式转换的功能给屏蔽掉。
MSDN上有一个注意点描述了下面的事实,当构造函数参数超过两个时自动取消隐式转换。例如
1 class gxgExplicit
2
3 {
4
5 private:
6
7 int _size;
8
9 int _age;
10
11 public:
12
13 explicit gxgExplicit(int age, int size)
14
15 {
16
17 _age = age;
18
19 _size = size;
20
21 }
22
23 };
这是有没有关键字效果是一样的。那就是相当于有这个关键字。
但是另外一种情况例外:其中只有一个必须输入的参数,其余的为有默认值的参数。
1 class gxgExplicit
2
3 {
4
5 private:
6
7 int _size;
8
9 int _age;
10
11 public:
12
13 explicit gxgExplicit(int age, int size = 0)
14
15 {
16
17 _age = age;
18
19 _size = size;
20
21 }
22
23 };
- [Silverlight动画]转向行为 - 介绍
- WCF技术剖析之十七:消息(Message)详解(中篇)
- flash游戏引擎整理
- [Silverlight动画]转向行为 - 群落
- [Silverlight动画]转向行为 - 路径跟随
- [Silverlight动画]转向行为 - 漫游行为
- [Silverlight动画]转向行为 - 对象回避
- [mobile开发碎碎念]手机页面上显示PDF文件
- Windows Server 2008 R2 配置AD(Active Directory)域控制器
- ios开发基础知识 - 2
- ios开发基础知识 - 1
- 为UINavigationBar添加自定义背景
- UIScrollView无法响应touches的解决方法
- WCF技术剖析之十七:消息(Message)详解(下篇)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法