C++ Explicit关键字详细解析
explicit关键字用来修饰类的构造函数,表明构造函数是显示的,相对的是implicit关键字。
首先这个关键字只能用在类内部的构造函数声明上,而不能用在类外部的函数定义上,它的作用是不能进行隐式转换。
class gxgExplicit //没有关键字explicit的类
{
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代表的是堆栈的大小,那么调用的第二句就显得不伦不类,而且容易让人疑惑。这并不是可以让代码阅读者明白和接受的形式,虽然它是合法的(编译器可以通过编译)。这是因为编译器默认情况下有隐式转换的功能,你输入gE2 = 1就编译成同第一句相同的结果。所以,explicit就派上了用场。修改代码为:
class gxgExplicit
{
public:
int _size;
explicit gxgExplicit(int size)
{
_size = size;
}
};
继续上面的调用:
gxgExplicit gE1(24); //这样是没有问题的
gxgExplicit gE2 = 1; //这样是不行的,关键字取消了隐式转换
gxgExplicit gE3; //这样是不行的,没有默认构造函数
gE1 = 2; //这样是不行的,关键字取消了隐式转换
gE2 = 3; //这样是不行的,关键字取消了隐式转换
gE2 = gE1; //这样是不行的,关键字取消了隐式转换,除非类实现操作符“=”的重载。
这是编译器(vs2005)显示:cannot convert from 'int' to 'gxgExplicit'。
从这里也就看出这个关键字的作用是将编译器隐式转换的功能给屏蔽掉。
MSDN上有一个注意点描述了下面的事实,当构造函数参数超过两个时自动取消隐式转换。例如
class gxgExplicit
{
private:
int _size;
int _age;
public:
explicit gxgExplicit(int age,int size)
{
_age = age;
_size = size;
}
};
这是有没有关键字效果是一样的。那就是相当于有这个关键字。
但是另外一种情况例外:其中只有一个必须输入的参数,其余的为有默认值的参数。
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;
}
};
上一篇:C++中拷贝构造函数的总结详解
栏 目:C语言
下一篇:STL常用容器详细解析
本文标题:C++ Explicit关键字详细解析
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/4100.html
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10深入理解C++中常见的关键字含义
- 01-10使用C++实现全排列算法的方法详解
- 01-10c++中inline的用法分析
- 01-10用C++实现DBSCAN聚类算法
- 01-10全排列算法的非递归实现与递归实现的方法(C++)
- 01-10C++大数模板(推荐)
- 01-10浅谈C/C++中的static与extern关键字的使用详解
- 01-10深入C/C++浮点数在内存中的存储方式详解
- 01-10深入理解C/C++混合编程
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-10C#中split用法实例总结
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 01-10SublimeText编译C开发环境设置
- 04-02jquery与jsp,用jquery
- 01-10delphi制作wav文件的方法