Итак, рассмотрим следующий код:
#include <iostream>
using namespace std;
class A {
public:
A() = default;
A(const A& rhs) {
cout << "Copy was made!" << endl;
}
};
class B {
public:
A data;
int foo;
B(A data, int foo) : data(data), foo(foo) {
}
};
int main() {
A data;
B foo(data, 10);
return 0;
}
Это распечатывает:
Копия сделана!
Копия сделана!
Да, это верно, он копирует дважды!
Первая копия происходит, когда мы передаем data
конструктору B's
. Вторая копия происходит, когда мы копируем data
из конструктора в переменную участника.
Мы знаем, что мы не можем пройти под 1 копией (если только мы не пойдем heap & pointers
). Так почему бы нам не написать всегда:
B (const A& data, const int& foo, const SomeOtherType& bar, const float& aFloatyNumber)
... и так далее.
Я знаю, что передавать int, float и т. д. по значению дешево. Но, всегда имея const ref
в качестве Constructor
параметров, мы гарантируем на 1 меньше копий.
we will garantie 1 less copy
Это имеет значение, только если копии дорогие. Копированиеint
дешево - дешевле, чем косвенное обращение, необходимое для доступа к тому жеint
по ссылке. - person Igor Tandetnik   schedule 20.09.2015const A& data
. Для POD это не имеет никакого значения, вероятно, компилятор оптимизирует косвенность и просто копируетint
и т. д. - person vsoftco   schedule 20.09.2015