Разыменование само по себе никогда не делает копию. Хотя разыменование указателя просто применяет оператор *
, и в вашем коде происходит нечто большее.
Здесь:
int num = 10;
int *ptr = #
int& num2 = *ptr;
последняя строка разыменовывает указатель и использует результат для инициализации ссылка num2
. num2
теперь ссылки num
. Никаких копий.
Здесь:
int num = 10;
int *ptr = #
int num2 = *ptr;
в последней строке вы первый раз ptr
затем используйте результат для инициализации num2
. Поскольку num2
является значением, копия сделана.
Вам не нужны указатели, чтобы увидеть тот же эффект:
int x = 42;
int& y = x; // no copy, y is an alias for x
int z = x; // z is a copy of x