05-对定制的“类型转换”函数保持警惕
第二章,操作符
条款5 对定制的“类型转换”函数保持警惕
描述
自定义隐式类型转换函数,易导致代码行为异常、编译歧义,非必要不使用,使用时需严格限制。
一、两类隐式类型转换的来源
1、转换运算符
格式:operator 目标类型() const;,将类对象隐式转为目标类型。
class Rational { |
2、单参数构造函数
含默认参数的多参构造也归为此类,允许参数类型隐式转为类对象。
class Rational { |
二、隐式转换的核心问题
1、编译歧义:多转换路径时编译器无法判断,直接报错;
2、行为不可控:隐式转换改变运算逻辑,结果不符合预期;
3、可读性差:无显式标记,维护时难以发现转换行为。
// 同时定义上述两种转换,触发编译歧义 |
三、解决隐式转换问题的3种方法
1、替换转换运算符
用具名显式函数替代,强制手动调用。
class Rational { |
2、构造函数加explicit
禁止参数类型隐式转为类对象,仅允许显式构造。
class Rational { |
3、重载类的运算符
直接重载核心运算,避免通过隐式转换调用内置运算符。
class Rational { |
四、核心使用原则
1、单参数构造函数默认加explicit;
2、不定义转换运算符,优先用具名显式函数;
3、避免双向隐式转换,显式转换优于隐式转换。
总结
隐式类型转换的便捷性远低于其带来的风险,工程中以显式为原则,通过explicit、具名函数、运算符重载三种方式,彻底规避隐式转换的问题。
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
