最佳答案
阅读一些关于转换操作符和构造函数的问题,让我思考它们之间的相互作用,也就是当有一个“模糊的”调用时。考虑以下代码:
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();
}
};
int main()
{
B b = A(); //what should be called here? apparently, A::operator B()
return 0;
}
上面的代码显示“称为 A 的转换运算符”,这意味着调用转换运算符与构造函数相对。如果从 A
中删除/注释掉 operator B()
代码,编译器将很高兴地切换到使用构造函数(代码没有其他更改)。
我的问题是:
B b = A();
是一个模棱两可的调用,因此这里必须有某种类型的优先级。这种优先权究竟是在哪里确立的?(请提供 C + + 标准的参考/引用)A
对象应该如何成为 B
对象,A
或 B
?根据 C + + ,答案是 A
——在面向对象的实践中,是否有任何东西表明应该这样做?对我个人来说,这两种方式都有意义,所以我很想知道这个选择是如何做出的。先谢谢你