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

243
06 июня 2017, 00:28

Добрый день. Есть такая реализация Оператора присваивания

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 при этом не испортится, ведь его передают по ссылке

Answer 1

В передаче по ссылке ничего плохого нет. Совсем не обязательно, что объект испортится, если его передать по ссылке в какую-то функцию. Более того, если его передать по const ссылке, то он гарантированно не изменится. Зато при передаче объекта по ссылке мы экономим на его копировании. (Не вызываем конструктор копирования, как при передачи по значению).

В качестве параметра для оператора присваивания будет передан B, а в функцию swap А

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

READ ALSO
Вывод по ключу в порядке убывания.

Вывод по ключу в порядке убывания.

Есть простая хеш-функция key%m; Массив из m=20 элементов Есть 100 объектов, с рандомными ключамиМассив представляет собой массив стеков

299
Плагин MMENU jquery

Плагин MMENU jquery

При нажатие на меню, страницу скроллит вверх и только после этого открывается меню на фотке скрипт включения, в библиотеке ничего не менял,...

346
jQuery нажать на ссылку с текстом

jQuery нажать на ссылку с текстом

Как в Jquery программными средствами нажать на элемент ?

290
php не видит cookie “/” в другой папке

php не видит cookie “/” в другой папке

Папка "/", устанавливаем setcookie("a", 1, time()+3600*10101); Заходим в папку "/test", читаем кук 'a'Кука нет

393