Страницы

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

четверг, 13 декабря 2018 г.

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

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


Ответ

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

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

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