Так само, як можна оголосити вказівник на константне значення, так само можна оголосити і посилання на константне значення в мові С++.
Посилання на константні значення
Оголосити посилання на константне значення можна шляхом додання ключового слова const перед типом даних:
|
1 2 |
const int value = 7; const int &ref = value; // ref - це посилання на константу value |
Посилання на константні значення часто називають просто «посиланнями на константи» або «константні посилання».
Ініціалізація посилань на константи
На відміну від посилань на неконстантні значення, які можуть бути ініціалізовані лише неконстантними l-values, посилання на константні значення можуть бути ініціалізовані неконстантними l-values, константними l-values і r-values:
|
1 2 3 4 5 6 7 |
int a = 7; const int &ref1 = a; // ок: a - це неконстантне l-value const int b = 9; const int &ref2 = b; // ок: b - це константне l-value const int &ref3 = 5; // ок: 5 - це r-value |
Як і у випадку з вказівниками, константні посилання також можуть посилатися і на неконстантні змінні. При доступі до значення через константне посилання, це значення автоматично вважається const, навіть якщо вихідна змінна не є такою:
|
1 2 3 4 5 |
int value = 7; const int &ref = value; // створюємо константне посилання на змінну value value = 8; // ок: value - це не константа ref = 9; // заборонено: ref - це константа |
Посилання r-values
Зазвичай r-values мають область видимості виразу, що означає, що вони знищуються в кінці виразу, в якому створені:
|
1 |
std::cout << 3 + 4; // 3 + 4 обчислюється в r-value 7, яке знищується в кінці цього стейтменту |
Проте, коли константне посилання ініціалізується значенням r-value, час життя r-value продовжується відповідно до часу життя посилання:
|
1 2 3 4 5 |
int somefcn() { const int &ref = 3 + 4; // зазвичай результат 3 + 4 має область видимості виразу і знищився б в кінці цього стейтменту, але, оскільки результат виразу зараз прив'язаний до посилання на константне значення, std::cout << ref; // то ми можемо використати його тут } // і час життя r-value продовжується до цієї точки, коли константне посилання знищується |
Константні посилання в якості параметрів функції
Посилання, які використовуються в якості параметрів функції, також можуть бути константними. Це дозволяє отримати доступ до аргументу без його копіювання, гарантуючи, що функція не змінить значення, на яке посилається посилання:
|
1 2 3 4 5 |
// ref - це константне посилання на переданий аргумент, а не копія аргументу void changeN(const int &ref) { ref = 8; // заборонено: ref - це константа } |
Посилання на константні значення особливо корисні в якості параметрів функції через їх універсальність. Константне посилання в якості параметра дозволяє передавати неконстантний аргумент l-value, константний аргумент l-value, літерал або результат виразу:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <iostream> void printIt(const int &a) { std::cout << a; } int main() { int x = 3; printIt(x); // неконстантне l-value const int y = 4; printIt(y); // константне l-value printIt(5); // літерал в якості r-value printIt(3+y); // вираз в якості r-value return 0; } |
Результат виконання програми:
3457
Щоб уникнути непотрібного, занадто витратного копіювання аргументів, змінні, які не є фундаментальних типів даних (типів int, double тощо) або вказівниками, — повинні передаватися по (константному) посиланню в функцію. Фундаментальні типи даних повинні передаватися по значенню у випадку, якщо функція не змінюватиме їх значень.
Правило: Змінні не фундаментальних типів даних і які не є вказівниками, передавайте в функцію по (константному) посиланню.

(70 оцінок, середня: 4,94 з 5)
В розділі Константні посилання в якості параметрів функції – чи правильно “Посилання, які використовуються в якості параметрів функції, також можуть бути константними. Це дозволяє отримати доступ до аргументу без його копіювання”
коли аргумент в данному випадку не копіюється а робить pass-by-value. Це трохи плутає в визначенні наприклад:
void somefnc(int a) – тут відбувається копія , а в інших випадках воно передає значення void somefnc(int &a) OR void somefnc(int *a)