Что может помочь, на начальном этапе, это думать о ссылок, как синтаксический сахар для указателей.
Рассмотрим следующий пример:
int main() {
int x = 5;
int *px = &x;
*px = 8;
cout << x << endl;
return 0;
}
Это печатает 8
, как и следовало ожидать. (Если вы не ожидали, что тогда, возможно, стоит прочитать introduction to pointers перед рассмотрением ссылок.)
Эта ссылочная переменная может рассматриваться как переменная-указатель, синтаксис которой является регулярной переменной. Далее эквивалентно предыдущему примеру:
int main() {
int x = 5;
int &rx = x;
rx = 8;
cout << x << endl;
return 0;
}
То есть, rx
становится ссылка наx
, и, таким образом, каждый раз, когда вы меняете rx
, вы меняете x
, а также, потому что оба названия относятся к одной и той же вещи. .. или, другими словами, rx
связан с адресом в памяти , не значение, и установки rx
изменяет то, что в этом месте памяти.
В некотором смысле rx
является своего рода невидимым - это не имеет существование своей собственной, она существует только в плане того, что x
является (именно поэтому вы должны инициализировать ссылку, когда он объявил, то есть вы не может сделать int ℞
в функции и оставить его висит).
Так что, когда у вас есть:
void addOne(int &y)
{
y = y + 1;
}
Это функция параметр, является ссылка на то, что передается в ... и поэтому, когда опорный параметр изменяется, то, что ссылка относится к также изменяется.
И поэтому, когда вы называете это так:
int main()
{
int x = 5;
std::cout << "x = " << x << '\n';
addOne(x);
std::cout << "x = " << x << '\n';
return 0;
}
Это вызывает addOne
с x
, таким образом инициализирует int &
ссылку y
на x
, и поэтому, когда y
изменяется, x
меняется ... и так x
изменяется от 5
до 5 + 1
, то есть 6
.
Вы можете думать об этом как эквивалентно следующему:
void addOne(int *py)
{
*py = *py + 1;
}
int main()
{
int x = 5;
std::cout << "x = " << x << '\n';
addOne(&x);
std::cout << "x = " << x << '\n';
return 0;
}
Чтобы понять, почему вы хотите использовать ссылку против указателя см this question.
Возможно, вы захотите получить [приличную книгу на C++] (http://stackoverflow.com/q/388242/253056) и прочитать главу о * ссылках *. –
Вот что я сделал. Но я действительно не получаю эту часть в заметках. Вот почему мне нужно больше людей, чтобы помочь мне здесь, чтобы лучше понять. .. – Student
'addOne' просто добавляет 1 к любой переменной' int', которую вы передаете ей (* по ссылке *). Таким образом, в этом случае вы передаете 'x', который имеет значение 5, и он добавляет к нему 1, чтобы стать 6. –