C++学习笔记25:explicit 关键字与隐式类型转换
目录一、什么是隐式类型转换二、为什么会发生这种转换三、隐式类型转换的过程四、explicit 的作用五、什么时候需要 explicit六、C11 后的花括号初始化七、小结一、什么是隐式类型转换在C中有些情况下编译器会自动进行类型转换。比如double d 10;这里 10 是 int 类型但可以自动转换成 double 类型。在类和对象中构造函数也可能发生隐式类型转换。例如class Date { public: Date(int year) : _year(year) , _month(1) , _day(1) { } private: int _year; int _month; int _day; };如果这样写Date d 2024;编译器会把 2024 转换成一个 Date 对象。可以理解为Date d(2024);这就是构造函数产生的隐式类型转换。二、为什么会发生这种转换因为 Date 类中由一个单参数的构造函数。Date(int year)他可以用一个 int 类型的数据构造出一个 Date 对象。所以当写Date d 2024;编译器会认为可以用 2024 构造一个 Date 对象。这种方法虽然简单但有时候也可能让代码含义不够清楚。三、隐式类型转换的过程代码Date d 2024;大致可以理解为先用 2024 构造一个临时 Date 对象 在用这个临时对象初始化 d有些编译器可能会进行优化直接构造 d 但从语法理解上可以先这样认为。四、explicit 的作用如果不希望构造函数发生隐式类型转换可以使用 explicit 关键字。写法class Date { public: explicit Date(int year) : _year(year) , _month(1) , _day(1) { } private: int _year; int _month; int _day; };加上 explicit 关键字后瞎买你这种写法就不允许了Date d 2024; //错误必须显示构造Date d(2024); // 正确也就是说explicit 可以禁止构造函数发生隐式类型转换。五、什么时候需要 explicit如果一个构造函数只有一个参数或者其他参数都有默认值就可能发生隐式类型转换。例如Date(int year)或者Date(int year, int month 1, int day 1)这种构造函数都能支持类似Date d 2024;如果这种转换容易遭阿成误解就建议加 explicit。例如explicit Date(int year, int month 1, int day 1)这样写可以让代码更明确。六、C11 后的花括号初始化C11 之后支持花括号初始化。Date d1{2024}; Date d2{2024, 5, 1};也可能出现这种写法Date d {2024, 5, 1};如果构造函数加了 explicit也会限制这种隐式类型转换。所以 explicit 的作用就是让对象构造更明确避免编译器会自动帮我们做一些不明显的转换。七、小结本篇主要学习了 explicit 关键字和隐式类型转换。需要记住单参数构造函数可能发生隐式类型转换Date d 2024 可能会调用 Date(int year)隐式转换可能生成临时对象explicit 可以禁止构造函数隐式类型转换加了 explicit 后应使用 Date d(2024) 这种显示写法当构造函数可能造成歧义时建议使用 explicit。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2637940.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!