在这里阅读一些关于转换运算符和构造函数的问题让我想到了它们之间的交互,即当有一个“模棱两可”的调用时。考虑以下代码:
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 的转换运算符”,这意味着调用转换运算符而不是构造函数。如果您从 中删除/注释掉operator B()
代码A
,编译器会很高兴地转而使用构造函数(代码没有其他更改)。
我的问题是:
- 由于编译器不认为
B b = A();
这是一个模棱两可的调用,所以这里必须有某种优先级。这个优先级究竟是在哪里建立的?(来自 C++ 标准的参考/引用将不胜感激) - 从面向对象的哲学角度来看,这是代码应该表现的方式吗?谁知道更多关于一个
A
对象应该如何成为一个B
对象,A
或者B
?根据 C++,答案是A
——在面向对象的实践中是否有任何东西表明应该是这种情况?就我个人而言,无论哪种方式都有意义,所以我很想知道是如何做出选择的。
提前致谢