explicit关键字引入✒️
🔎explicit
是一个关键字,同时也是显式的意思,用于修饰构造函数。当构造函数被 explicit
修饰时,它将禁止编译器执行隐式类型转换。这主要用于防止在某些上下文中发生不期望的类型转换。
观察以下代码🚦
class Date { public: Date(int year) :_year(year) {} /* Date(int year, int month = 1, int day = 1) : _year(year) , _month(month) , _day(day) {}*/ Date& operator=(const Date& d) { cout << "赋值拷贝" << endl; if (this != &d) { _year = d._year; _month = d._month; _day = d._day; } return *this; } private: int _year; int _month; int _day; }; void Test() { Date d1(2022); d1 = 2023; } int main() { Test(); return 0; }
✋以上代码的Test()函数中,可以直接给对象d1赋值一个2023,编译器会先将2023作为一个参数调用Date类的构造函数(该构造函数必须要只有一个参数,或者第一个参数为无缺省值,其余参数都有缺省值的半缺省的构造函数)生成一个没有名字的对象,再将这个对象赋值拷贝给对象d1.
✋以上代码同时也说明了,构造函数不仅可以构造与初始化对象,对于单个参数或者除第一个参数无默认值其余均有默认值的构造函数,还具有类型转换的作用。
⭐️而explicit关键字可以禁止这种隐式的类型转换
现在将上面代码的构造函数用explicit关键字修饰
explicit Date(int year) :_year(year) {} /* explicit Date(int year, int month = 1, int day = 1) : _year(year) , _month(month) , _day(day) {}*/
报错信息如下 🚦
⭐️ 使用 explicit
关键字可以避免一些潜在的错误,尤其是在涉及单参数构造函数的情况下,防止不经意的隐式类型转换。