#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;
Комментариев нет:
Отправить комментарий