Да, параметры, переданные по значению, копируются. Однако вы также можете передавать переменные по ссылке. Ссылка является псевдонимом, поэтому параметр делает псевдоним переменной, а не копию. Например:
void foo(int x) {}
void bar(int& x) {}
int i;
foo(i); // copies i, foo works with a copy
bar(i); // aliases i, bar works directly on i
Если вы пометите его как const, у вас будет псевдоним только для чтения:
void baz(const int&);
baz(i); // aliases i, baz reads-only i
В общем, всегда передавайте по const-ссылке. Когда вам нужно изменить псевдоним, удалите const. И наконец, когда вам нужна копия, просто передайте по значению. *
* И, как хорошее практическое правило, фундаментальные типы (int, char * и т. Д.) И типы с sizeof(T) < sizeof(void*)
должны передаваться по значению вместо const-reference, поскольку их размер достаточно мал, копирование будет быстрее, чем совмещение имен.