簡體   English   中英

為類重載=運算符

[英]Overloading of = operator for a class

我最近在操作符重載中刷新了我的C ++知識。 按照建議,我operator overload of '='operator overload of '='返回對*this的引用。 但后來我發現了一個問題: -

#include <iostream>
using namespace std;

class MyClass
{
    int num = 4;
    public:
        MyClass() = default;
        MyClass(int x) : num(x) {}
        void getnum(int x)
        {
            num = x;
        }
        void shownum()
        {
            cout << num << '\n';
        }
        MyClass& operator = (const MyClass& obj)  // works even without const
        {
            this->num = obj.num;
            return *this;
        }
        ~MyClass() = default;
};

int main()
{
    MyClass x, y(5), z(7);

    z = MyClass(8) = y;   // temporary object return reference

    x.shownum();
    y.shownum();
    z.shownum();
}

這個代碼不會導致UB即使臨時對象MyClass(8)介於其間將等同於y (精細沒問題)但是它的引用將被發送為與z等同。 為什么dangling reference問題不會出現在這里? 為什么重載函數在沒有const MyClass&' on the temporary object 'MyClass(8)

臨時居住直到完整的表達結束。 最后臨時消失,但到那時分配已全部執行,因為你沒有將參考存儲在任何地方,臨時離開是可以的。

第一個賦值MyClass(8) = y; 返回一個MyClass&並且沒有告訴任何關於臨時的事情。 因此它匹配下一個operator=的參數,無論是否需要const或非const參數。

如果你試圖只分配一個臨時的z = MyClass(8); ,您將看到它現在要求參數為const引用。

此外,這里沒有懸空引用,因為臨時對象一直存在到完整表達式的末尾(通常在; ),並且沒有指針或引用保存在任何地方。 只是num值的副本。

暫無
暫無

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

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