鉴于这是该类中唯一的==函数,
bool myClass::operator == ( const myClass & rhs )
{
if ( var1 == rhs.var1 )
return true;
else
return false;
}
以下比较假设是什么?
myClass mc1;
anotherClass ac1;
if ( mc1 == ac1 )
我的直觉是说它假设ac1将被转换为myClass类型,但是怎么会发生呢? operator ==有一个myClass&类型的参数。 rhs,那么当ac1传递给函数时,如何调用myClass的转换构造函数?
谢谢!
答案 0 :(得分:3)
参数的类型为const myClass &
,因此调用转换调用,构造临时,并将对此类临时的const引用传递给函数。返回后,临时工具将被销毁。
答案 1 :(得分:1)
编译器左侧并尝试为其找到合适的运算符。
所以它将采用==运算符,并尝试通过强制转换使右侧适合myClass
。
如果找不到隐式强制转换为myClass,则会返回编译错误。
答案 2 :(得分:1)
给定mc1 == ac1
的编译器将使用任何函数的正常重载决策规则为运算符==(A,B)搜索最佳匹配。
假设它发现你的bool myClass::operator==(const myClass&)
函数明确地最匹配(可能不是这种情况。例如,它可能会发现一个运算符声明为bool operator==(const myClass&, const anotherClass&)
而不是优先),它将绑定并生成与任何函数调用一样必要的参数转换。
要从anotherClass类型的lvale转换为const myClass&
(假设anotherClass不从myClass继承,在这种情况下不需要转换),它将搜索单个(明确最好)< strong>转换构造函数或转换运算符将参数转换为myClass临时值,然后执行operator == call。
函数的参数是非const引用,而不考虑执行此类临时转换。原因是非const引用通常表示该函数将对该参数执行一些副作用,当临时被销毁而原始对象不受影响时将被丢弃 - 因此很可能是一个逻辑错误,意外地丢弃了这个副作用而不是故意这样做 - 所以语言设计者不允许这样做。
答案 3 :(得分:1)
由于该运算符没有完美的重载,因此调用转换构造函数(它计为隐式转换),以这种方式创建的临时值将传递给operator==
。通话结束后,临时被摧毁。
请注意,如果operator==
接受非const
引用,则不会发生这种情况,因为临时值只能绑定到const
引用。
答案 4 :(得分:0)
你的假设是正确的。编译器首先将转换构造函数调用,然后使用转换后的对象作为rhs参数调用您的==方法。
答案 5 :(得分:0)
你的谜语还有两个可能的答案,既不涉及会话构造者。
存在免费功能bool operator==(const myClass&, const &anotherClass);
或
anotherClass
公开来自myClass
。