Предаване на аргументи
В C параметрите на функцията се предават по стойност. С други думи – при извикване на дадена функция, параметрите, които се предават се копират и в тялото на функцията се използват копията. Нека разгледаме следния пример:
void plus2(int x) {
x+=2;
}
int main() {
int counter=0;
plus2(counter);
...
}
Тъй като параметрите на функциите се предават по стойност, операцията в ред 2 се извършва върху копие на предадената стойност. Това означава, че извикването на функцията plus2 в ред 6 няма да доведе до промяна на стойността на променливата counter.
Ако е необходимо функцията да променя стойността на аргументите си, то може да се използват указатели, т.е. като параметри на функцията се предават не самите променливи, а указатели към тях. Да разгледаме следния фрагмент:
void plus2(int* px) {
*px+=2;
}
int main() {
int counter=0;
plus2(&counter);
...
}
Съгласно дефиницията на функцията plus2 в ред 1 като параметър се предава указател към int. В тялото на функцията, в ред 2, операцията се извършва върху обекта, към който сочи предаденият указател. Това означава, че когато в ред 6 се извика функцията plus2 и като параметър се предаде указател към променливата counter, при изпълнение на функцията ще се промени стойността на променливата към която сочи указателят, т.е. променливата counter.
В езика C този подход е единственият, който позволява една функция да променя параметрите си. В C++ има една допълнителна възможност – аргументите на функцията да се предават не по стойност, а като препратки. Да разгледаме следния фрагмент:
void plus3(int& x) {
x+=2;
}
int main() {
int counter=0;
plus3(counter);
...
}
При дефиницията на функцията plus3 в ред 1 е указано, че параметърът x на функцията се предава като препратка. Това означава, че когато в ред 6 функцията се извиква с действителен аргумент променливата counter, в тялото на функцията се предава препратка към променливата counter. Операциите в тялото на функцията се извършват върху препратката към действителния аргумент, което означава, че при промяна на формалния аргумент в ред 2, се променя предадения действителен аргумент на функцията – променливата counter.

Pingback: CPP-101: Кратък обзор на езика за програмиране C++ | Записки по програмиране