簡體   English   中英

是否為此重載運算符調用了轉換構造函數? (C ++)

[英]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參數調用==方法。

您的謎語還有兩個可能的答案,都不涉及對話構造函數。

  1. 有一個自由函數, bool operator==(const myClass&, const &anotherClass); , 要么

  2. anotherClass是從myClass公開派生的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM