Лекция 6. Ссылки, инициализация, перегрузка функций и именованные скоупы
Ссылки (lvalue ref)
- «Псевдоним» для уже существующего объекта.
- Обязательно инициализирована при объявлении.
- Не занимает дополнительную память (формально; на практике может реализовываться через указатель).
- Нельзя сделать указатель на ссылку, нельзя сделать массив ссылок.
- Продлевают «жизнь» временным переменным (если ссылка константная и инициализируется временным объектом).
- Скорее всего, компилятор сам передаёт адреса при передаче аргументов по ссылке, но нас это не заботит — на уровне языка это просто другое имя.
Опасности и правила
- Возвращать ссылку на локальную переменную при выходе из функции — ошибка (объект уничтожен, ссылка «висячая»).
- Можно возвращать ссылку, которую мы изначально передали в аргументе функции (переменная не локальна для функции).
- В случае больших объектов нужно передавать по ссылке (предпочтительно
const&), чтобы не забивать стек вызова функции лишними копиями.
Перегрузка функций
- Функции с одинаковым именем, но разными списками параметров.
- Нельзя перегружать функции с одинаковыми аргументами, но разными возвращаемыми типами — компилятор не сможет однозначно выбрать функцию.
Инициализация — виды
| Вид | Пример |
|---|---|
| Default initialization | std::string s1; |
| Value initialization | int l{}; |
| Direct initialization | std::string s4("hello"); |
| Copy initialization | std::string s3 = "hello"; |
| List initialization | std::string str{'a', 'b', 'c'}; |
| Aggregate initialization | char a[3] = {'a', 'b'}; |
Namespace
- Предотвращают конфликт имён.
- Могут состоять из нескольких блоков (могут быть «раскрыты» в разных местах).
- Упрощают читабельность кода.
Unnamed namespace:
namespace {
void helper() { /* ... */ }
}
- Помогает в линковке.
- Замена
static-функции на уровне файла (внутри неименованного namespace всё имеет internal linkage).
Namespace alias:
namespace SN = Foo::SomeLongNamespaceName;