explicit关键字【C++】

image

explicit关键字【C++】

用来修饰只有一个参数的类构造函数,以表明该构造函数是显式的,而非隐式的
禁止类对象之间的隐式转换,以及禁止隐式调用拷贝构造函数

隐式类型转换

int i = 1;
double d = i;

d被i赋值时
【编译器会做】
在中间产生一个临时变量
再通过这个临时对象进行拷贝构造给d

构造函数具有类型转换的作用

class Date
{
public:
// 构造函数
	Date(int year)
		:_year(year)    // 初始化列表
	{}

private:
	int _year;
	int _month = 3;
	int _day = 31;
};
int main()
{
    // d1 和 d2 都会调用构造函数
	Date d1(2022);
	Date d2 = 2023;
	return 0;
}

Date d2 = 2023;发生了隐式类型转换
image

如果做引用
Date& d3 = 2024;报错
image
原因:d3是一个Date类型,2024则是一个内置类型的数据

const Date d2 = 2023;可正常运行传值
原因:临时变量具有常性,它就是通过Date类的构造函数构造出来的,同类型之间可以做引用

explicit的作用:【禁止类型转换】

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

只在类的构造函数前进行修饰

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

const Date d2 = 2023;会报错

多参情况

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

这两种都可正常调用
Date d2 = { 2023, 3 };
const Date& d3 = { 2024, 4 };

若加入explicit

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

则不可正常调用

posted @ 2024-11-26 14:57  White_ink  阅读(53)  评论(0)    收藏  举报