Добрый день. Есть такая реализация Оператора присваивания
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.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Есть простая хеш-функция key%m; Массив из m=20 элементов Есть 100 объектов, с рандомными ключамиМассив представляет собой массив стеков
При нажатие на меню, страницу скроллит вверх и только после этого открывается меню на фотке скрипт включения, в библиотеке ничего не менял,...
Папка "/", устанавливаем setcookie("a", 1, time()+3600*10101); Заходим в папку "/test", читаем кук 'a'Кука нет