Предаване на аргументи
В 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++ | Записки по програмиране