转换构造函数与转换运算符:优先级
在 C 中,转换构造函数和转换运算符都提供了在不同类型之间转换对象的方法。当两者都可用于给定转换时,了解它们的优先级对于确定调用哪一个至关重要。
优先级建立
转换构造函数和转换运算符之间的优先级是由 C 标准 (13.3.1.4) 定义:
重载解析用于选择要调用的用户定义转换。候选函数选择如下:
- 目标类型的转换构造函数(12.3.1)是候选函数。
- 源类型及其基类的转换函数,产生与目标类型兼容的类型是候选函数。
运算符重写构造函数
在提供的示例代码中,其中转换构造函数和A类到B类定义了转换运算符,转换运算符优先:
class A; class B { public: B(){} B(const A&) //conversion constructor { cout << "called B's conversion constructor" << endl; } }; class A { public: operator B() //conversion operator { cout << "called A's conversion operator" << endl; return B(); } };
这是因为,在绑定引用参数(这里是转换函数的隐式对象参数)时,非常量转换函数 (A&) 中的引用优先于转换构造函数 (const A&) 中的 const 引用。
面向对象的哲学考虑
关于哪个类应该负责转换对象的哲学问题,标准支持源类(在本例中为 A)。这符合封装的原则,因为它允许源类控制转换过程并确保结果对象(B)的正确性。
最终由开发人员自行决定确定适当的转换机制针对具体场景,考虑封装、抽象、代码可读性等因素。
以上是在类型之间转换时:源对象优先还是目标对象优先?的详细内容。更多信息请关注PHP中文网其他相关文章!