double& c_re, double& c_im)
{ c_re=a_re*b_re-a_im*b_im;
c_im=a_im*b_re+a_re*b_im;
}
Зверніть увагу на те, що розраховані значення дійсної та уявної частин комплексної величини c (c_re та c_im) передаються за допомогою параметрів-посилань, вони мають тип double&.
Таким чином, якщо ми створюємо функцію, що повинна змінювати стан деякого зовнішнього об'єкта, ми можемо обрати один із двох варіантів: використати параметр-покажчик або параметр-посилання. Різниця, яка виникає при їх застосуванні ілюструється у наступному прикладі процедурами swap1 і swap2. Призначення обох функцій однаково: обмін значеннями двох зовнішніх об'єктів типу long:
void swap1(long *px, long *py)
{ long R=*px; *px=*py; *py=R;
}
Приклад застосування функції swap1:
long a=3, b=4;
swap1(&a,&b);
void swap2(long &x, long &y)
{ long R=x; x=y; y=R;
}
Застосування функції swap2:
long a=3, b=4;
swap2(a,b);
У першому варіанті застосовано параметри-покажчики, у другому - параметри-посилання. Зверніть увагу на те, що виклики функцій swap1 і swap2 записується по різному.
Якщо параметром функції є масив, він ніколи не передається по значенню, замість цього передається адреса першого елементу масиву.
Простори імен
Ім'я функції, що не є членом класу, належить глобальному простору імен. Ім'я функції - члена класу належить простору свого класу. Всі імена, що оголошуються всередині функції, належать простору цієї функції. Цьому ж простору належать і імена параметрів, які оголошуються у заголовку функції.
Значення, що повертаються
Якщо тип, що повертається, позначено словом void, то така функція не повертає будь-якого значення. Такі функції називають процедурами. Наведена вище функція swap є такою процедурою.Взагалі функція може повертати: значення будь-якого раніше визначеного типу, або адресу об'єкта, або посилання на зовнішній об'єкт.
Дещо незвичним є випадок, коли функція повертає посилання. У прикладі, наведеному нижче, визначається функція F(i,k), що дозволяє звертатися до одновимірного глобального масиву R[400] як до двовимірної матриці розміром 20х20:
// Приклад 2
int R[400];
int& F(int i, int j)
{ return R[20*i+j];
}