C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > explicit关键字

C++ 之explicit关键字

作者:烽起黎明

今天我们来谈谈C++中的explicit关键字,这篇文章详细介绍了C语言的关键字explicit关键字,本文有详细的代码实例,感兴趣的同学可以借鉴参考

👉构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用

一、单参构造函数

class Date
{
public:
	Date(int year)
		:_year(year)
	{}

private:
	int _year;
	int _month = 3;
	int _day = 31;
};

对于下面的d1很清楚一定是调用了有参构造进行初始化,不过对于d2来说,也是一种构造方式

int main()
{
	Date d1(2022);
	Date d2 = 2023;
	
	return 0;
}

依旧通过调试来看就会非常清晰,这种写法也会去调用构造函数

在这里插入图片描述

在操作符章节,我有提到过【隐式类型转换】这个概念,像下面将一个int类型的数值赋值给到一个double类型的数据,此时就会产生一个隐式类型转换

int i = 1;
double d = i;

在这里插入图片描述

💬小陈:不是说构造函数有初始化列表吗?拷贝构造怎么去初始化呢?

//拷贝构造
Date(const Date& d)
	:_year(d._year)
	,_month(d._month)
	,_day(d._day)
{}

同学,别忘了【拷贝构造】也是属于构造函数的一种哦,也是会有初始化列表的

刚才说到了中间会产生一个临时对象,而且会调用构造 + 拷贝构造,那此时我们在Date类中写一个拷贝构造函数,调试再去看看会不会去进行调用

在这里插入图片描述

💬小叶:但您是怎么知道中间赋值这一块产生了临时对象呢?如果不清楚编译器的优化机制这一块肯定就会认为这里只有一个构造

Date& d3 = 2024;

可以看到,报出了一个错误,原因就在于d3是一个Date类型,2024则是一个内置类型的数据

在这里插入图片描述

在这里插入图片描述

其实这里的真正原因就在于产生的这个【临时变量】,它就是通过Date类的构造函数构造出来的,同类型之间可以做引用。还有一点就是临时变量具有常性,所以给到一个const类型修饰对象不会有问题

但若是你不想让这种隐式类型转换发生怎么办呢?此时就可以使用到C++中的一个关键字叫做explicit

explicit Date(int year)
	:_year(year)
{}

在这里插入图片描述

二、多参构造函数

对于上面所讲的都是基于单参的构造函数,接下去我们来瞧瞧多参的构造函数

//多参构造函数
Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

在这里插入图片描述


💬小冯:那要怎么办呀,对于一定要传入多参数进行构造的场景

这个时候就要使用到我们C++11中的新特性了,在对多参构造进行初始化的时候在外面加上一个{}就可以了,可能你觉得这种写法像是C语言里面结构体的初始化,但实际不是,而是在调用多参构造函数

Date d2 = { 2023, 3 };

在这里插入图片描述

const Date& d3 = {<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E--> 2024, 4 };

那要如何去防止这样的隐式类型转换发生呢,还是可以使用到explicit关键字吗?

//多参构造函数
explicit Date(int year, int month ,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

在这里插入图片描述

explicit Date(int year, int month = 3,int day = 31)
	:_year(year)
	,_month(month)
	,_day(day)
{}

所以对于可读性不是很好的代码,可以使用explicit修饰构造函数,将会禁止构造函数的隐式转换

以上就是C++ 之explicit关键字的详细内容,更多关于explicit关键字的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文