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;
发生了隐式类型转换
如果做引用
Date& d3 = 2024;
报错
原因: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)
{}
则不可正常调用