Функції С++ мають два обмеження: аргументи передаються як значення і втрачають зв’язок з початковими даними, функція може повертати тільки одне значення. Для подолання цих обмежень можна використовувати вказівники або посилання. Синтаксис використання вказівників відрізняється від синтаксису використання посилань, але результат буде однаковий – замість копії об’єкту програми, яка існує в області видимості функції, в функцію буде переданий реальний ісходний об’єкт.
#include <iostream>
using namespace std;
void swap1( int * a, int * b ) {
int t = *a;
*a = *b;
*b = t;
}
void swap2( int & a, int & b ) {
int t = a;
a = b;
b = t;
}
int main() {
int x = 3, y = 4;
swap1( &x, &y );
swap2( x, y );
}
Якщо в функцію необхідно передавати великий за розміром або складністю об’єкт, то витрати часу і пам'яті на створення його копії можуть бути значними. Тому передача в функцію посилання на такий об’єкт є більш ефективним. Якщо всередині функції об’єкт змінювати не треба, можна використовувати посилання на константні об’єкти.
#include <iostream>
using namespace std;
struct student {
int id;
int rating;
};
void show1( student s ) {
cout << s.id << " : " << s.rating << endl;
}
void show2( student * s ) {
cout << s->id << " : " << s->rating << endl;
}
void show3( student & s ) {
cout << s.id << " : " << s.rating << endl;
}
void show4( const student & s ) {
cout << s.id << " : " << s.rating << endl;
}
int main() {
student s = { 1, 95 };
show1( s );
show2( &s );
show3( s );
show4( s );
}
В функції 3 можна змінювати значення полей структури студент, і ці зміни будуть впливати на оригінал цієї структури. В функції 4 такі зміни заборонені.