Чтобы немного уточнить два ответа, которые уже даны:
Когда вы определяете переменные как «такие же, как» некоторые другие переменные, у вас есть две основные возможности:
ClassA aCopy = someOtherA; //copy
ClassA& aRef = someOtherA; //reference
Вместо неконстантных ссылок lvalue, конечно, есть константные ссылки и ссылки rvalue. Главное, что я хочу здесь отметить, это то, что aCopy
не зависит от someOtherA
, а aRef
практически такая же переменная, как someOtherA
, это просто другое имя (псевдоним) для нее.
С параметрами функций в основном то же самое. Когда параметр является ссылкой, он привязывается к аргументу при вызове функции и является просто псевдонимом для этого аргумента. Это означает, что вы делаете с параметром, вы делаете с аргументом:
void f(int& iRef) {
++iRef;
}
int main() {
int i = 5;
f(i); //i becomes 6, because iRef IS i
}
Когда параметр является значением, это всего лишь копия аргумента, поэтому независимо от того, что вы делаете с параметром, аргумент остается неизменным.
void f(int iCopy) {
++iCopy;
}
int main() {
int i = 5;
f(i); //i remains 5, because iCopy IS NOT i
}
При передаче по значению параметр является новым объектом. Так и должно быть, поскольку это не то же самое, что аргумент, он независим. Создание нового объекта, который является копией аргумента, означает вызов конструктора копирования или конструктора перемещения, в зависимости от того, является ли аргумент lvalue или rvalue. В вашем случае передача функции по значению не требуется, потому что вы только читаете аргумент.
Существует руководство от GotW #4. :
Предпочитайте передавать параметр только для чтения с помощью const&, если вы собираетесь только читать его (а не копировать).
person
Arne Mertz
schedule
24.05.2013