簡體   English   中英

C++ 編程:引用如何在運算符重載中工作?

[英]C++ Programming: How do references work in operator overloading?

我試圖理解為什么在重載 C++ 運算符時使用引用。 例如,在下面的一段代碼中:

GenericObject& operator=(const GenericObject &rhs)
{
    if (&rhs == this)
        return *this;
    objectAttribute = GenericObject.objectAttribute;
    return *this;
}

我有三個問題:

  1. 為什么函數返回一個引用?
  2. 為什么函數接受引用? 是為了避免復制對象內容的費用(如果 GenericObject 對象是參數而不是對 GenericObject 的引用,這將是必要的)?
  3. 將右側與此進行比較時,為什么在第三行中使用了參考?

盡我所能,您的問題的答案是:

  1. 您返回一個引用,因為它將在稍后的構造函數/析構函數調用中保存您。 我的一位教授使用的一個很好的經驗法則是“如果有疑問,按照整數做。” 當你看一個像int x = 1, y = 2, z = 3; x = y = z; int x = 1, y = 2, z = 3; x = y = z; ,通過引用返回允許您獲取z的值,將其分配給y ,然后獲取(新的) y的值並將其分配給x 按值返回要求您創建z的副本,使用它來分配y ,刪除z的副本,然后創建(新的) y的副本以在刪除此副本之前分配x 對於整數可能不是什么大問題,但它可能意味着更長的程序和更大的數據。

  2. 你完全正確! 出於同樣的原因,我們試圖在第一部分中節省時間和精力,我們通過引用傳遞右側項目以避免必須進行重復(這需要構造函數/析構函數調用)並將其設為const以便我們不能無意中更改它,因為這與operator=不合邏輯。 作為旁注,如果您在某些情況下不小心,額外的構造函數/析構函數調用可能是危險的(有關此示例,請參閱深拷貝與淺拷貝)。

  3. 當您撥打x = y;類的電話時x = y; , 邏輯上等價於x.operator=(y); . 因為 x 是某個對象,所以我們需要一種方法來引用整個事物,而關鍵字this允許此功能。 然而, this是一個指針,所以因為我們試圖比較一個指針和一個對象,所以我們需要指向rhs (或在我的例子中是y )持有的對象,我們通過使用&獲得這個地址。

暫無
暫無

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

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