为什么朋友重载操作最好转换操作符在这种情况下,
-
19-09-2019 - |
题
您好我有一个这样的代码,我认为两个朋友重载操作和转换操作符具有类似的功能。但是,为什么重载运营商的朋友在这种情况下,叫什么?什么是规则?
太感谢了!
class A{
double i;
public:
A(int i):i(i) {}
operator double () const { cout<<"conversion operator"<<endl;return i;} // a conversion operator
friend bool operator>(int i, A a); // a friend funcion of operator >
};
bool operator>(int i, A a ){
cout<<"Friend"<<endl;
return i>a.i;
}
int main()
{
A aa(1);
if (0 > aa){
return 1;
}
}
解决方案
没有转换是必要的被称为重载operator>
。为了使内置operator>
被调用,一个转换是必要的(用户定义的转换运算符。重载分辨率倾向于具有较少所需的转换的选项,因此在使用重载operator>
。
请注意,如果你要改变你的超载operator>
的定义为,例如:
friend bool operator>(double i, A a);
你会得到一个编译错误,因为无论是超载operator>
和内置operator>
需要一个转换,编译器将不能够解决的不确定性。
其他提示
我不是说我的回答是标准的支持,还是让我们在逻辑上考虑一下。
在打这个行:
0 > aa
您有两种选择。要么你拨打提供的操作员:
friend bool operator>(int i, A a);
这是100%兼容,或者你可以做两次转换到达目的地!你会选择哪一个?
如果添加一个转换算子然后类型A的对象可被转换时,你最期望它的两倍。
有一个好的方案没有提供被意外地使用了他的阶级和转换运营商开辟了opertunity在意想不到的情况下,整个主机使用的类(通常情况下,你会期望编译时错误的方式不是自动类型的转换,因为)。
其结果是转换运算符(和单个参数构造)应与由于某些情况小心treateed是在你最预计它编译器可以做转换。
这就是所谓的,因为它是一个完全匹配在表达式0 > aa
的上下文。事实上,这是很难搞清楚你怎么想出了一个“为什么”的问题。通过逻辑,一了期待一个“为什么”的问题,如果朋友的不的呼吁在这种情况下。
如果你改变到0.0 > aa
的表达,则该呼叫将beciome模糊,因为neuther路径将优于其他
不隶属于 StackOverflow