Explicit keyword
说实话,从来没有感觉到这个keyword实用,直到今天。
explicit的意思是明显的,和它相相应的一个词是implicit意思是隐藏的。
我參考了MSDN和《c++标准程序库》对这个keyword的描写叙述,并參考了网络上对这个keyword的解释。现将它的用法和总结记录例如以下:
首先这个keyword仅仅能用在类构造函数。它的作用是不能进行隐式转换。
class gxgExplicit //没有keywordexplicit的类
{
public:
int _size;
gxgExplicit(int size)
{
_size = size;
}
};
以下是调用
gxgExplicit gE1(24); //这样是没有问题的
gxgExplicit gE2 = 1; //这样也是没有问题的
gxgExplicit gE3; //这样是不行的,没有默认构造函数
gE1 = 2; //这样也是没有问题的
gE2 = 3; //这样也是没有问题的
gE2 = gE1; //这样也是没有问题的
可是假如gxgExplicit改动为Stack,我们的_size代表的是堆栈的大小,那么调用的第二句就显得不伦不类,并且easy让人疑惑。这并非能够让代码阅读者明确和接受的形式,尽管它是合法的(编译器能够通过编译)。这是由于编译器默认情况下有隐式转换的功能,你输入gE2 = 1就编译成同第一句同样的结果。所以,explicit就派上了用场。改动代码为:
class gxgExplicit
{
public:
int _size;
explicit gxgExplicit(int size)
{
_size = size;
}
};
继续上面的调用:
gxgExplicit gE1(24); //这样是没有问题的
gxgExplicit gE2 = 1; //这样是不行的,keyword取消了隐式转换
gxgExplicit gE3; //这样是不行的,没有默认构造函数
gE1 = 2; //这样是不行的,keyword取消了隐式转换
gE2 = 3; //这样是不行的,keyword取消了隐式转换
gE2 = gE1; //这样是不行的,keyword取消了隐式转换,除非类实现操作符“=”的重载。
这是编译器(vs2005)显示:cannot convert from 'int' to 'gxgExplicit'。
从这里也就看出这个keyword的作用是将编译器隐式转换的功能给屏蔽掉。
MSDN上有一个注意点描写叙述了以下的事实,当构造函数參数超过两个时自己主动取消隐式转换。比如
class gxgExplicit
{
private:
int _size;
int _age;
public:
explicit gxgExplicit(int age, int size)
{
_age = age;
_size = size;
}
};
这是有没有keyword效果是一样的。那就是相当于有这个keyword。
可是第二种情况例外:当中仅仅有一个必须输入的參数,其余的为有默认值的參数。
class gxgExplicit
{
private:
int _size;
int _age;
public:
explicit gxgExplicit(int age, int size = 0)
{
_age = age;
_size = size;
}
};
class gxgExplicit
{
private:
int _size;
int _age;
int _hight;
public:
explicit gxgExplicit(int age, int size = 0)
{
_age = age;
_size = size;
_hight = hight;
}
};
这种情况下相当于一个參数的效果。
到如今为止。这个keyword就是这么用了。
Explicit keyword的更多相关文章
- Use of explicit keyword in C++
Predict the output of following C++ program. 1 #include <iostream> 2 3 using namespace std; 4 ...
- C# 自己定义 implicit和explicit转换
explicit 和 implicit 属于转换运算符,如用这两者能够让我们自己定义的类型支持相互交换explicti 表示显式转换.如从 A -> B 必须进行强制类型转换(B = (B)A) ...
- Explicit
Prefixing the explicit keyword to the constructor prevents the compiler from using that constructor ...
- explicit 构造函数
一.构造函数.默认构造函数.合成的默认构造函数 构造函数,是函数名与类名同样.没有返回类型的特殊的成员函数.能够有初始化列表. 默认构造函数,没有形參.或全部形參都有默认实參的构造函数. 假设没有显示 ...
- C++ essentials 之 explicit constructor
这篇博客的源起是我下面的一段代码 #include <bits/stdc++.h> using namespace std; int main(){ priority_queue<l ...
- Google C++ Style Guide
Background C++ is one of the main development languages used by many of Google's open-source project ...
- 9.Methods(二)
4.Operator Overload Methods allow a type to define how operators should manipulate instances of the ...
- Learn Python More
0, 看了一个python项目开源源码, 才知道现在这点python知识实在是弱爆了.. 尼玛就像学了2500个常用汉字, 然后要去理解"楚辞".. 代码如下, 解释一点一点从网上 ...
- backref 用法
源码 def backref(name, **kwargs): """Create a back reference with explicit keyword argu ...
随机推荐
- 线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法
线程锁的概念函数EnterCriticalSection和LeaveCriticalSection的使用方法 注:使用结构CRITICAL_SECTION 需增加头文件#include “afxmt. ...
- hdu1561(树形背包)
给定n,m表示n个城堡,我们可以选择攻占m个城堡.要使得价值最大 接下来n行 a b, 第i行的a b,表示攻占第i个城堡的价值为b,但需要先攻占第a个城堡 如果有多个a=0的点,那么就不是一棵树 ...
- C++ Primer高速学习 第一章 获得二:输入和输出 (IO)
什么是输入输出.即Input-Output,缩写是非常装B的IO?请看经典民间解释: C++语言的输入输出是指信息从外部输入设备(如键盘.磁盘等)向计算机内部(内存)输入(即Input)和从内存向外单 ...
- android studio学习
http://blog.csdn.net/ryantang03/article/details/8948037 http://www.it165.net/pro/html/201109/676.htm ...
- 重新想象 Windows 8 Store Apps (14) - 控件 UI: RenderTransform, Projection, Clip, UseLayoutRounding
原文:重新想象 Windows 8 Store Apps (14) - 控件 UI: RenderTransform, Projection, Clip, UseLayoutRounding [源码下 ...
- java序列化是什么和反序列化和hadoop序列化
1.什么是序列化和系列化DE- 神马是序列化它,序列化是内存中的对象状态信息,兑换字节序列以便于存储(持久化)和网络传输.(网络传输和硬盘持久化,你没有一定的手段来进行辨别这些字节序列是什么东西,有什 ...
- 3Dmax+blend+WPF综合运用
原文:3Dmax+blend+WPF综合运用 赛后总结 本人小菜,WPF刚入门,只是写一下最近的项目心得.欢迎各位前辈们前来拍砖指正,感激不敬!先申明,小弟我入门仓促,很多东西也是一知半解,所以很多问 ...
- 在mac os下编译android -相关文章
1. Mac OS X下编译Android源码 http://blog.csdn.net/bulreed/article/details/22783467 2.MAC OS 编译 Android源代码 ...
- unicode下一个,读取数据库乱码问题
TCHAR cbContent[512]; dyn.GetFieldValue(0,cbContent,512); // 中文会显示乱码 AfxMessageBox(cbConte ...
- Android锁定屏幕或关闭状态-screen,高速按两次音量向下键来实现拍摄功能(1.1Framework在实现的形式层广播)
思想的实现: WindowManagerService循环读取下面的关键信息和分发形式.在PhoneWindowManager.interceptKeyBeforeQueueing方法中进行消 ...