Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

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

#cpp


Почему в операторе присваивания мы возвращаем *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;
}

    


Ответы

Ответ 1



Возвращать из оператора присваивания вы можете что угодно (или вообще ничего). Главное, чтобы в операторе присваивания, как и в любой другой функции, тип значения, указанного в return, совпадал с (или был приводим к) типу возврата, указанного в объявлении функции. Вы же сами написали, что ваш оператор присваивания имеет тип возврата Matrix &. Это значит, что в return вам придется указывать lvalue типа Matrix. *this таким lvalue является, а this - не является. Тем не менее никто вам не запрещает написать оператор присваивания, который будет возвращать, например, Matrix *. В таком операторе присваивания вы можете возвращать this: Matrix *Matrix::operator =(const Matrix& m2) { ... return this; } Это будет весьма странным типом возврата для оператора присваивания, но ничего нелегального тут нет. Другими словами, что вы сами указали в типе возврата функции - то и возвращайте. Так что вопрос о том, почему в вашем случае возвращать надо именно *this - это вопрос именно к вам. Вы сами так захотели.

Ответ 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;

Комментариев нет:

Отправить комментарий