C++学习之explicit关键字详解


这篇文章是有关C++ explicit学习的内容。

作用和使用方法

explicit关键字可以阻止不应该允许的经过转换函数进行的隐式转换的发生,声明为explicit的构造函数不能在隐式转换中使用。

explicit关键字只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显式的,而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。

注意:当类的声明和定义分别在两个文件中时,explicit只能写在在声明中,不能写在定义中。

理解

由于在C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。一 是构造;二是默认且隐含的类型转换操作符。所以,如果写下如AAA = XXX这样的代码, 且恰好XXX的类型正好是AAA单参数构造器(构造函数)的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。这种隐式转换在某些情况下, 违背了程序员的本意。 这就要在该构造器前加上explicit修饰, 指定该构造器只能被明确的调用/使用, 不能作为类型转换操作符被隐含的使用。

示例程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>  
using namespace std;
class Test1
{
public :
Test1(int num):n(num){}
private:
int n;
};
class Test2
{
public :
explicit Test2(int num):n(num){}
private:
int n;
};

int main()
{
Test1 t1 = 12; //1 通过
Test2 t2(13); //2 通过
Test2 t3 = 14; //3 此行会编译错误,提示:无法从“int”转换为“Test2”

return 0;
}

1处编译通过,是因为C++中,如果构造函数只有一个参数,在编译时就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象。也就是说 Test1 t1 = 12;这段代码,编译器自动将整型转换为Test1类对象,实际上等同于下面的操作:

1
Test1 t1(12);

或者:

1
2
Test1 temp(12);
Test1 t1 = temp;

3处编译不通过,就是因为Test3类的定义中,构造函数前面加了explicit关键字,阻止了类构造函数的隐式自动转换。

参考链接:

1、http://www.cnblogs.com/ymy124/p/3632634.html

2、https://blog.csdn.net/tianmingdyx/article/details/79823470

本文标题:C++学习之explicit关键字详解

文章作者:阿翔

发布时间:2018年05月09日 - 10:05

最后更新:2019年05月28日 - 21:05

原始链接:http://ttshun.com/2018/05/09/C++学习之explicit关键字详解/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

点击给我一些鼓励叭!
-------------本文结束感谢您的阅读-------------
0%