- •12. Класи пам'яті даних 100
- •13. Робота з файлами 106
- •14. Посилання 111
- •Склад мови
- •Алфавіт мови
- •Лексеми
- •Ключові слова
- •Ідентифікатори
- •Константи
- •Символьні рядки
- •Знаки операцій, роздільники, коментарі
- •Типи даних
- •Класифікація типів даних
- •Цілочислові типи
- •Дійсні типи
- •Оголошення змінних і констант
- •Переліки
- •Структура програми
- •Функція main
- •Область дії змінної
- •Введення і виведення даних
- •Функції стандартної математичної бібліотеки
- •Вирази і операції
- •Поняття виразу, операнда, операції
- •Порядок виконання операцій
- •Арифметичні операції
- •Порозрядні операції
- •Операції порівняння
- •Логічні операції
- •Операції присвоєння
- •Умовна операція
- •Операція визначення розміру sizeof
- •Узгодження типів у виразах
- •Умовні оператори
- •Оператори
- •Умовний оператор if
- •Оператор вибору switch
- •Оператори циклу
- •Цикл з параметром. Оператор for
- •Цикл з передумовою. Оператор while
- •Цикл з постумовою. Оператор do while
- •Оператори переходу
- •Використання псевдовипадкових чисел
- •Одновимірні масиви
- •Багатовимірні масиви
- •Символьні рядки
- •Вказівники
- •Оголошення вказівника, операції, пов’язані з вказівниками
- •Адресна арифметика
- •Void – вказівники, типізація вказівників
- •Звертання до елементів масивів через вказівники
- •Масиви символьних рядків і масиви вказівників
- •Динамічне виділення пам’яті
- •Структури і об’єднання
- •Оголошення і ініціалізація структур
- •Звертання до елементів структур
- •Перейменування типів
- •Об’єднання
- •Поля бітів
- •Директиви препроцесора
- •Призначення директив препроцесора
- •Директива включення #include
- •Директиви макропідстановок #define I #undef
- •Директиви умовної компіляції
- •Директиви #ifdef, #ifndef
- •Функції
- •Структура функції
- •Виклик функцій. Прототипи функцій
- •Взаємодія фактичних і формальних параметрів функцій
- •Inline – функції
- •Масиви і символьні рядки як параметри функцій
- •Використання кваліфікатора const в оголошеннях параметрів
- •Багатовимірні масиви як параметри функцій
- •Опрацювання структур у функціях
- •Вказівники на функції
- •Рекурсивні функції
- •Класи пам'яті даних
- •Клас пам'яті, час існування і видимість об’єкта
- •Область дії глобальних і локальних змінних
- •Специфікатори класів пам'яті
- •Специфікатори глобальних змінних
- •Багатофайлові програми
- •Робота з файлами
- •Звертання до файлів
- •Послідовний запис до файлу і послідовне читання з файлу
- •Файли з довільним доступом
- •Посилання
- •Призначення посилань
- •Передача аргументів функцій як посилань
Посилання
Призначення посилань
Посилання призначені для створення псевдонімів об’єктів програми. Раніше ми використовували вказівники, які зберігали адреси обїектів програми, і через вказівники отримували доступ до цих об’єктів. При цьому використовували дві операції – визначення адреси (&) і звертання за адресою *. Посилання надають майже ті самі можливості, що і вказівники, але мають більш простий синтаксис.
Визначення посилання має такий синтаксис:
тип & ім’я_посилання ім’я_змінної;
При створенні посилання його необхідно ініціалізувати за допомогою імені іншого об’єкту програми. Після цього посилання буде діяти як альтернативне ім’я даного об’єкту, всі операції над посиланням в дійсності будуть виконуватися над цим об’єктом.
#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;
}
Передача аргументів функцій як посилань
Функції С++ мають два обмеження: аргументи передаються як значення і втрачають зв’язок з початковими даними, функція може повертати тільки одне значення. Для подолання цих обмежень можна використовувати вказівники або посилання. Синтаксис використання вказівників відрізняється від синтаксису використання посилань, але результат буде однаковий – замість копії об’єкту програми, яка існує в області видимості функції, в функцію буде переданий реальний ісходний об’єкт.
#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 такі зміни заборонені.
