C++explicit关键字的作用

前言

时不时就会看到explicit修饰的构造函数,它的作用是什么呢?

implicit与explicit的意思

单词翻译成中文的意思
implicit:含蓄的、暗示的
explicit: 明确的、清楚的
在编程场景里,一般用隐式(implicit)、显式(explicit)来称呼
很明显,它们是一对反义词

隐式的作用

在C++里,没有implicit关键字,单参数的构造函数默认是隐式的
隐式的作用就是支持隐式转换。
看个例子

#include <iostream>
class Watermelon{
    
    
public:
	Watermelon(int weight)
		:mWeight(weight){
    
     ;}
	void PrintWeight() {
    
    
		std::cout << "weight: " << mWeight << std::endl;
	}
private:
	int mWeight;
}

int main() 
{
    
    
	Watermelon w1 = 10;
	Watermelon w2(13);
	w1.PrintWeight();
	w2.PrintWeight();
	return 0;;
}

打印结果

	weight: 10
	weight: 13

不知道你们有没有发现一行代码不太好理解?就是这一行
等号左边是Watermelon类,右边却是一个整数,类型不匹配啊。但是却能正常运行,并且打印出来的重量是10。

	Watermelon w1 = 10;

为什么呢?
原来,上面那行代码,编译器把它转换成下面这个样子。
而这,就是构造函数的隐式转换

	Watermelon w1 = Watermelon(10);

explicit的作用

explicit:明确的、清楚的。
正如它的含义一样,被explicit修饰的构造函数,在使用时必须要明确、清楚,让人一目了然!

把例子的Watermelon的构造函数加上explicit修饰

	explicit Watermelon(int weight)
		:mWeight(weight){
    
     ;}

然后,
像下面这种不明确类型初始化语句,会在编译时就报错: 无法从“int”转换为"Watermelon"
这就是explicit的作用

	Watermelon w1 = 10;

下面这句就能正常运行

	Watermelon w1 = Watermelon(10);

注意点

隐式转换在构造函书只有一个参数时起作用,
为什么?
因为当构造函数有多个参数时,是没办法隐式转换的

	WaterMelon(int w, int z){
    
    ;} 
	WaterMelon w1 = 10; 	//错误

当有第一个参数后面的参数有默认值时,是可以隐式转换的

	WaterMelon(int w, int z =1){
    
    ;} 
	WaterMelon w1 = 10; 	//正确

构造函数有多个没有默认值的参数时,构造函数默认是显式的。
所以
只有当构造函数只有一个无默认值参数时,explicit才有作用。

猜你喜欢

转载自blog.csdn.net/qq_40541268/article/details/122893606
今日推荐