[..], но когда я изменяю его после его передачи, он не влияет на оригинал.
Честно говоря, у вас есть базовое c недоразумение. И чтобы прояснить это, я должен сделать небольшой обход.
Передать по значению
void foo_value(int x) { x += 42; }
, вызывая эту функцию через
int y = 50;
foo_value(y);
не изменит значение y
.
Передача по ссылке
void foo_ref(int& x) { x += 42; }
вызов этой функции изменит y
:
int y = 50;
foo_ref(y);
assert(y == 50+42);
Перепривязка ссылок
Вы не можете перепривязать ссылки. Вот почему вы не можете не инициализировать ссылку:
int& y; // error
int x;
int& y = x; // ok
Если у вас есть ссылка, вы не можете заставить ее ссылаться на что-то другое. Вы не можете «переназначить» ссылку:
int x = 0;
int& ref = x;
int y = 42;
ref = y; // same as x = y;
после последней строки, ref
все еще является ссылкой на x
.
Ваш код
Вы передаете ball
по ссылке, но ваш участник mBall
не является ссылкой. mBall
является копией мяча, на который ссылается ball
. Пример, аналогичный вашему коду:
void foo_copy_from_ref(int& x) {
int mx = x;
mx = 42;
}
Изменение копии не влияет на оригинал, независимо от того, сделали ли вы копию из ссылки.
У вас может быть ссылка на Ball
как член, но вы должны инициализировать его в конструкторе, и вы не можете заставить его ссылаться на другой Ball
позже.