【发布时间】:2010-11-25 22:07:24
【问题描述】:
在这里阅读一些关于转换运算符和构造函数的问题让我想到了它们之间的交互,即当存在“模糊”调用时。考虑以下代码:
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——在面向对象的实践中是否有任何东西表明应该是这种情况?就我个人而言,无论哪种方式都有意义,所以我很想知道是如何做出选择的。
提前致谢
【问题讨论】:
-
你注释“//拷贝构造函数”的那行不是拷贝构造函数,它是构造函数。
-
你说得对,我误用了这个词。我已经编辑了。
标签: c++ constructor operators type-conversion conversion-operator