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 @   White_ink  阅读(23)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示