簡體   English   中英

在 C++ 中重載方法時,是否可以考慮相等運算符並將返回值分配給另一個 class 實例?

[英]When overloading methods in C++, is it possible to consider the equal operator and assign the return value to another class instance?

是否可以在 class 中使用一種方法來修改其自己的 class 實例,但通過重載它還可以修改另一個 class 實例,甚至創建一個新實例,例如使用等號? 還是我需要以特殊方式重載運算符?

像這樣的東西:

class MyClass{
public:
    MyClass() {};
    MyClass(int x): number(x) {};

    void increaseNumber(){
        number++;
    }

    MyClass increaseNumber() const{
        MyClass tempObj(this->number);
        tempObj.number++
        return tempObj;
    }
private:
    int number = 0;
}


int main(){
    MyClass a(10);
    
    a.increaseNumber();             // -> a.number == 11
    MyClass b = a.increaseNumber()  // -> b.number == 12   ???
}

首先,我希望我正確理解了您的問題,如果您不是這個意思,請糾正我。 只要更改簽名,就可以完成重載。 在您的代碼中,簽名由 const 關鍵字更改,也返回類型。 我可以給你一個在同一個 class 中重載等號兩次的例子,如下所示:

第一個實現用作默認副本,您將 rhs 復制到 lhs,而第二個實現移動數據而不復制。

class Factor {
    int _n = 0;
    int _d = 1;        
    
public:
    Factor & operator = (const Factor &);
    Factor & operator = (Factor &&) noexcept;

Factor & Factor::operator = ( const Factor & rhs ) {
    message("op =");
    if( this != &rhs ) {
        _n = rhs.numerator();
        _d = rhs.denominator();
    }
    return *this;
}

Factor & Factor::operator = ( Factor && rhs ) noexcept {
    message("op move =");
    if ( this != &rhs ) {
        _n = std::move(rhs._n);
        _d = std::move(rhs._d);
        rhs.reset();
    }
    return *this;
}

作為對我的結論和對我自己問題的回答:

  1. 您不能通過更改返回類型但保持相同的參數來重載方法。 因此,為此您必須定義一個具有不同名稱的方法。

  2. 如果使用另一個已經存在的 class 實例和等號初始化 class 實例,則調用(復制?)構造函數而不是賦值運算符。 例如:

 MyClass a(10); MyClass b = a;

暫無
暫無

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

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