Оператор присваивания

396
08 июня 2017, 07:53

Почему в операторе присваивания мы возвращаем *this, а не просто this?

Matrix & Matrix::operator =(const Matrix& m2) {
    if (this != &m2) {
        (Matrix(m2)).swap(*this);
    }
    return *this;
}
Matrix Matrix::operator +(const Matrix &m2) {
    if (m2.columns != this->columns || m2.rows != this->rows) {
        std::cout << "Error" << std::endl;
        exit(1);
    }
    Matrix temp(this->rows, this->columns);
    for (int i = 0; i < this->rows; i++) {
        for (int j = 0; j < this->columns; j++) {
            temp[i][j] = m2.matrix[i][j] + this->matrix[i][j];
        }
    }
    return temp;
}
Answer 1

Возвращать из оператора присваивания вы можете что угодно (или вообще ничего). Главное, чтобы в операторе присваивания, как и в любой другой функции, тип значения, указанного в return, совпадал с (или был приводим к) типу возврата, указанного в объявлении функции.

Вы же сами написали, что ваш оператор присваивания имеет тип возврата Matrix &. Это значит, что в return вам придется указывать lvalue типа Matrix. *this таким lvalue является, а this - не является.

Тем не менее никто вам не запрещает написать оператор присваивания, который будет возвращать, например, Matrix *. В таком операторе присваивания вы можете возвращать this:

Matrix *Matrix::operator =(const Matrix& m2) {
  ...
  return this;
}

Это будет весьма странным типом возврата для оператора присваивания, но ничего нелегального тут нет.

Другими словами, что вы сами указали в типе возврата функции - то и возвращайте. Так что вопрос о том, почему в вашем случае возвращать надо именно *this - это вопрос именно к вам. Вы сами так захотели.

Answer 2

Потому что мы возвращаем ссылку на объект типа Matrix, а this -- указатель. Чтобы возвращать не указатель на объект, а сам объект мы разыменовываем указатель (это делается как раз с помощью оператора *). Поэтому и *this.

Возвращать значение осмысленно, например, потому, что мы сможем писать множественное присваивание:

class Foo{
     public:
    int x;
    Foo & operator=(const Foo& other) {
        x = other.x;
        return *this;
    }
    Foo(int a=0) {
        x = a;
    }
};

После этого можно будет написать:

Foo a,b,c;
a = b = c = 2;
READ ALSO
Восстановить формы и код С++ Builder 2006

Восстановить формы и код С++ Builder 2006

Вылетел проект, и не сохранилсяОстались файлы для каждой формы форматом

265
Кодировка в режиме сборки Release

Кодировка в режиме сборки Release

В проекте использую только Use Multi-Byte Character Set, то есть ASCIIВ режиме сборки Debug все работает хорошо

315
неразрешенный внешний символ C++/ VS 2017

неразрешенный внешний символ C++/ VS 2017

В части "Преобразование проекта С++ в расширение для Python": Не могу собрать проект, тк ошибки: LNK2001 у __imp__PyFloat_FromDouble, __imp__PyFloat_AsDouble, __imp__PyModule_Create2И...

386
Делаю в VS2012 C++ по примеру из Borland C++ Builder, выдает ошибку LNK2019

Делаю в VS2012 C++ по примеру из Borland C++ Builder, выдает ошибку LNK2019

ЗдравствуйтеПостепенно перепечатываю пример программы на ПК из http://we

355