Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КТіП Лекції 20110516 (1).doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать
☆
  1. Посилання

    1. Призначення посилань

Посилання призначені для створення псевдонімів об’єктів програми. Раніше ми використовували вказівники, які зберігали адреси обїектів програми, і через вказівники отримували доступ до цих об’єктів. При цьому використовували дві операції – визначення адреси (&) і звертання за адресою *. Посилання надають майже ті самі можливості, що і вказівники, але мають більш простий синтаксис.

Визначення посилання має такий синтаксис:

тип & ім’я_посилання ім’я_змінної;

При створенні посилання його необхідно ініціалізувати за допомогою імені іншого об’єкту програми. Після цього посилання буде діяти як альтернативне ім’я даного об’єкту, всі операції над посиланням в дійсності будуть виконуватися над цим об’єктом.

#include <iostream>

using namespace std;

int main( ) {

int a;

int &r = a;

a = 123;

cout << "a = " << a << endl; // 123

cout << "r = " << r << endl; // 123

r = 321;

cout << "a = " << a << endl; // 321

cout << "r = " << r << endl; // 321

}

Посилання, на відміну від вказівників, обов’язково необхідно ініціалізувати. Якщо це не зробити, виникне помилка компіляції.

Операція визначення адреси, застосована до посилання, повертає адресу об’єкту, псевдонімом якого є це посилання. В наступному прикладі на екран буде виведена адреса змінної а:

#include <iostream>

using namespace std;

int main( ) {

int a;

int &r = a;

cout << "&a = " << &a << endl;

cout << "&r = " << &r << endl;

}

Після створення і ініціалізації посилання завжди буде псевдонімом одного і того самого об’єкту:

#include <iostream>

using namespace std;

int main( ) {

int a = 123, b = 321;

int &r = a;

cout << "a = " << a << endl; // 123

r = b;

cout << "a = " << a << endl; // 321

}

Посилання може бути псевдонімом об’єкту будь-якого, в тому числі визначеного користувачем, типу. В наступному прикладі посилання є псевдонімом змінної структурного типу.

#include <iostream>

using namespace std;

int main( ) {

struct student {

int id;

int rating;

} s = { 1, 85 };

student &r = s;

cout << r.id << endl;

}

    1. Передача аргументів функцій як посилань

Функції С++ мають два обмеження: аргументи передаються як значення і втрачають зв’язок з початковими даними, функція може повертати тільки одне значення. Для подолання цих обмежень можна використовувати вказівники або посилання. Синтаксис використання вказівників відрізняється від синтаксису використання посилань, але результат буде однаковий – замість копії об’єкту програми, яка існує в області видимості функції, в функцію буде переданий реальний ісходний об’єкт.

#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 такі зміни заборонені.

113