Страницы

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

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

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

Есть такая реализация оператора присваивания
Matrix & Matrix::operator =(const Matrix& m2) { if (this != &m2) { (Matrix(m2)).swap(*this); } return *this; }
И функции swap:
void Matrix::swap(Matrix & x) { std::swap(x.matrix, matrix); std::swap(x.columns, columns); std::swap(x.rows, rows); }
Вопрос, почему оператор присваивания принимает объект по ссылке, как и функция swap, т.е. как я понимаю в процессе работы например такого кода:
Matrix A,B; A=B;
В качестве параметра для оператора присваивания будет передан B, а в функцию swap А, как итог произойдет обмен значениями, но разве объект B при этом не испортится, ведь его передают по ссылке


Ответ

В передаче по ссылке ничего плохого нет. Совсем не обязательно, что объект испортится, если его передать по ссылке в какую-то функцию. Более того, если его передать по const ссылке, то он гарантированно не изменится. Зато при передаче объекта по ссылке мы экономим на его копировании. (Не вызываем конструктор копирования, как при передачи по значению).
В качестве параметра для оператора присваивания будет передан B, а в функцию swap А
Всё верно. В оператор присваивания действительно будет передан B по ссылке. И даже будет передан по константной ссылке, что гарантирует неизменяемость этого объекта внутри функции. А в функцию swap будет передан действительно объект A по ссылке, но вот функция swap будет вызвана не у объекта B, а у его копии. Так как вызовем мы её у объекта Matrix(m2). То есть мы создадим новый объект Matrix с помощью конструктора копирования. И обмениваться значениями будет объект A с этой копией, что, разумеется, никак не повлияет на исходный объект B.

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

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