[英]Is a conversion constructor called for this overloaded operator? (C++)
鑒於這是該類中唯一的==函數,
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的轉換構造函數?
謝謝!
該參數的類型為const myClass &
因此將調用轉換調用,構造一個臨時變量,並將對該臨時變量的const引用傳遞給該函數。 歸還后,臨時設施將被銷毀。
編譯器采用左側,並嘗試為其找到合適的運算符。
因此,它將使用==運算符,並嘗試通過鑄造使右側適合myClass
。
如果找不到對myClass的隱式轉換,則將返回編譯錯誤。
給定mc1 == ac1
的編譯器將使用正常的任何函數的重載解析規則來搜索運算符==(A,B)的最佳匹配。
假設它找到您的bool myClass::operator==(const myClass&)
函數無疑是最佳匹配(情況可能並非如此。例如,它可能會發現一個聲明為bool operator==(const myClass&, const anotherClass&)
相反,它將綁定並進行必要的參數轉換,就像對任何函數調用一樣。
要從類型為anotherClass的lvale轉換為const myClass&
(假設anotherClass不繼承自myClass,在這種情況下無需進行轉換),它將搜索單個(無疑是最佳的) 轉換構造函數或轉換運算符來轉換將該參數放入myClass臨時對象,然后執行該操作符==調用。
如果函數的參數是非常量引用,則它將不考慮執行此類臨時轉換。 原因是非常量引用通常表明該函數將對該參數執行某些副作用,當臨時變量被銷毀而原始對象不受影響時,該副作用將被丟棄-因此,很可能是邏輯錯誤,意外地放棄了該副作用。而不是故意這樣做-因此語言設計人員不允許這樣做。
由於該操作符沒有完美的重載,因此將調用轉換構造函數(將其視為隱式轉換),並將以此方式創建的臨時傳遞給您的operator==
。 通話后,臨時站點被銷毀。
請注意,如果operator==
接受非const
引用,則不會發生這種情況,因為臨時變量只能綁定到const
引用。
您的假設是正確的。 編譯器將首先調用轉換構造函數,然后使用轉換后的對象作為rhs參數調用==方法。
您的謎語還有兩個可能的答案,都不涉及對話構造函數。
有一個自由函數, bool operator==(const myClass&, const &anotherClass);
, 要么
anotherClass
是從myClass
公開派生的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.