Возвращение методов-членов перегружается ссылкой или нет - PullRequest
1 голос
/ 04 апреля 2020

Итак, я видел видео, рассказывающее о перегрузках операторов в классе. Этот класс был фиктивным Number классом, который создавал действительные числа и мог использоваться как Number first(1) или Number second(2) (числа хранятся в элементе данных num), а затем мы перегружали операторы как методы-члены, чтобы иметь возможность сделать это first + second или -first. Код для этих перегрузок операторов выглядел так:

PS: rhs для правой стороны

Number &Number::operator+(const Number &rhs) {
   //perform math calculation between both objects
   return *this;  //return lhs by reference
}

или это для унарного оператора минус, который просто возвращает минус-версию одиночного целое число (бесполезно, но используется в качестве примера):

Number operator-() {
   int temp = -num;
   return temp;//temporary
}

Теперь в видео сказано, что мы должны вернуть объект по ссылке, если он использовался в цепочке операций после того, как он прошел через перегрузку, я также слышал это зависит от производительности (это чтобы избежать копирования?), но после этого я все еще не уверен, когда возвращать объект по ссылке или нет при перегрузках операторов класса.

Заранее спасибо.

1 Ответ

1 голос
/ 04 апреля 2020

Вы можете либо вызвать перегруженный оператор, либо:

  1. Двоичная арифметика c Операция: Вызовите перегруженную операторную функцию напрямую так же, как вызывается обычная функция:

    number1 + number2;              // normal expression
    operator+(number1, number2);    // equivalent function call
    

    В этом случае оба вызова эквивалентны. Оба вызывают функцию не-члена operator+, передавая number1 в качестве первого аргумента и number2 в качестве второго. Операция двоичного арифметического c не изменяет ни один из операндов - она ​​фактически возвращает новое значение из двух аргументов. Следовательно, вы не возвращаете ссылку.

  2. Составная операция присваивания: Другой вариант - явный вызов функции-члена:

    number1 += number2;             // expression-based call
    number1.operator+=(number2);    // equivalent call to a member operator function 
    

    Здесь оба оператора, вызовите функцию-член operator+=, связав this с адресом number1 и передав number2 в качестве аргумента. Следовательно, вы возвращаете его как ссылку.

    Number& operator+=(const Number& rhs) // compound assignment
    {                          
        /* addition of rhs to *this takes place here */
        return *this; // return the result by reference
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...