Посилання (С++)
В мові програмування С++, посилання це простий тип даних, який менш потужній, але більш безпечний ніж вказівник. Тип посилання іноді називається аліасом, і слугує для створення об’єкту додаткового імені. Посилання дозволяє маніпулювати об'єктом так само, як це робиться за допомогою вказівника, однак це не потребує спеціального синтаксису, яке необхідне при роботі з вказівниками. Зазвичай посилання використовуються як формальні параметри функцій. Сама назва С++ посилання може приводити до плутанини, оскільки в інформатиці під посиланням розуміють узагальнений концептуальний тип, а вказівники і посилання в C++ є специфічними реалізаціями цього типу посилання. Синтаксис і термінологіяДекларація посилання має наступну форму: <тип>& <імʼя> Де int A = 5;
int& rA = A;
extern int& rB;
int& foo ();
void bar (int& rP);
class MyClass { int& m_b; /* ... */ };
int funcX() { return 42; };
int (&xFunc)() = funcX;
const int& ref = 65;
В наведеному прикладі:
Порівняння з вказівникамиC++ посилання мають наступні відмінності в порівнянні з вказівниками:
Існує спосіб приведення між собою посилань і вказівників: оператор взяття адреси ( Оскільки операції з посиланнями є обмеженими, вони набагато легші в розумінні в порівнянні з вказівниками, тому призводять до меншої кількості помилок. Існує багато ситуацій, після яких вказівники можуть стати не дійсними, починаючи від можливості прийняти нульове значення до виходу за межі виділеної пам'яті, в той час як посилання можуть стати не дійсними в двох випадках:
Це легко контролювати автоматично, якщо посилання є статичним, але це є проблемою, якщо посилання є членом динамічно визначеного об'єкту, в такому випадку дуже складно бути впевненим в дійсності посилання. Це є єдиними складностями при роботі з посиланнями. Аналоги
Використання посиланьДуже зручною заміною вказівникам, посилання стають при використанні їх як параметрів функції, де вони використовуються для передачі вихідних параметрів (які можуть змінюватися функцією) без будь-яких явних процедур взяття адреси при викликанні функції. Наприклад: void square(int x, int& result)
{
result = x * x;
}
Наступний виклик, поверне значення 9 у змінну y: square(3, y);
В той час як наступний виклик, призведе до помилки компіляції, оскільки параметр у вигляді посилання не визначений як константний з ключовим словом square(3, 6);
Якщо функція повертає посилання, це дозволяє присвоювати до неї значення: int& preinc(int& x)
{
return ++x; // "повернення x++;" призвело б до не вірного результату
}
preinc(y) = 5; // те саме що ++y, y = 5
В багатьох реалізаціях, звичайний механізм передачі параметрів зазвичай потребує затратної операції копіювання, у разі якщо їх багато. Посилання із модифікатором void f_slow(BigObject x) { /* ... */ }
void f_fast(const BigObject& x) { /* ... */ }
BigObject y;
f_slow(y); // повільно, копіює значення y у параметр x
f_fast(y); // швидко, дає прямий доступ, без дозволу виконувати зміни, до y
Якщо функція У загальному випадку, надається перевага використанню константних посилань за вищевказаних причин швидкості. Однак, для малих типів такий метод є зайвим - створення копії малого обʼєкту може бути швидшою оперцією ніж створення абстракції з посиланнями. Поліморфна поведінкаПродовжуючи порівняння вказівників і посилань (в контексті C++), вони мають схожі можливості при застосуванні до поліморфних об'єктів: #include <iostream>
using namespace std;
class A
{
public:
A() {}
virtual void print() { cout << "Це клас A\n"; }
};
class B: public A
{
public:
B() {}
virtual void print() { cout << "Це клас B\n"; }
};
int main()
{
A a;
A& refToa = a;
B b;
A& refTob = b;
refToa.print();
refTob.print();
return 0;
}
Приведений код C++ видає наступний вивід на екран:
Посилання
Примітки
Див. також |
Portal di Ensiklopedia Dunia