Лекция 6

05.09.2025 Обновлено: 05.09.2025

Лекция 6. Ссылки, инициализация, перегрузка функций и именованные скоупы

Ссылки (lvalue ref)

  • «Псевдоним» для уже существующего объекта.
  • Обязательно инициализирована при объявлении.
  • Не занимает дополнительную память (формально; на практике может реализовываться через указатель).
  • Нельзя сделать указатель на ссылку, нельзя сделать массив ссылок.
  • Продлевают «жизнь» временным переменным (если ссылка константная и инициализируется временным объектом).
  • Скорее всего, компилятор сам передаёт адреса при передаче аргументов по ссылке, но нас это не заботит — на уровне языка это просто другое имя.

Опасности и правила

  • Возвращать ссылку на локальную переменную при выходе из функции — ошибка (объект уничтожен, ссылка «висячая»).
  • Можно возвращать ссылку, которую мы изначально передали в аргументе функции (переменная не локальна для функции).
  • В случае больших объектов нужно передавать по ссылке (предпочтительно const&), чтобы не забивать стек вызова функции лишними копиями.

Перегрузка функций

  • Функции с одинаковым именем, но разными списками параметров.
  • Нельзя перегружать функции с одинаковыми аргументами, но разными возвращаемыми типами — компилятор не сможет однозначно выбрать функцию.

Инициализация — виды

ВидПример
Default initializationstd::string s1;
Value initializationint l{};
Direct initializationstd::string s4("hello");
Copy initializationstd::string s3 = "hello";
List initializationstd::string str{'a', 'b', 'c'};
Aggregate initializationchar a[3] = {'a', 'b'};

Namespace

  • Предотвращают конфликт имён.
  • Могут состоять из нескольких блоков (могут быть «раскрыты» в разных местах).
  • Упрощают читабельность кода.

Unnamed namespace:

namespace {
    void helper() { /* ... */ }
}
  • Помогает в линковке.
  • Замена static-функции на уровне файла (внутри неименованного namespace всё имеет internal linkage).

Namespace alias:

namespace SN = Foo::SomeLongNamespaceName;