explicit关键字【C++】
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) {}
则不可正常调用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步