Лекция 6
Лекция 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:
05 сент.
salt-caramel