Урок №89. Ссылки и const

  Юрий  | 

  Обновл. 13 Сен 2021  | 

 48985

 ǀ   12 

Так же, как можно объявить указатель на константное значение, так же можно объявить и ссылку на константное значение в языке С++.

Ссылки на константные значения

Объявить ссылку на константное значение можно путем добавления ключевого слова const перед типом данных:

Ссылки на константные значения часто называют просто «ссылки на константы» или «константные ссылки».

Инициализация ссылок на константы


В отличие от ссылок на неконстантные значения, которые могут быть инициализированы только неконстантными l-values, ссылки на константные значения могут быть инициализированы неконстантными l-values, константными l-values и r-values:

Как и в случае с указателями, константные ссылки также могут ссылаться и на неконстантные переменные. При доступе к значению через константную ссылку, это значение автоматически считается const, даже если исходная переменная таковой не является:

Ссылки r-values

Обычно r-values имеют область видимости выражения, что означает, что они уничтожаются в конце выражения, в котором созданы:

Однако, когда константная ссылка инициализируется значением r-value, время жизни r-value продлевается в соответствии со временем жизни ссылки:

Константные ссылки в качестве параметров функции


Ссылки, используемые в качестве параметров функции, также могут быть константными. Это позволяет получить доступ к аргументу без его копирования, гарантируя, что функция не изменит значение, на которое ссылается ссылка:

Ссылки на константные значения особенно полезны в качестве параметров функции из-за их универсальности. Константная ссылка в качестве параметра позволяет передавать неконстантный аргумент l-value, константный аргумент l-value, литерал или результат выражения:

Результат выполнения программы:

3457

Во избежание ненужного, слишком затратного копирования аргументов, переменные, которые не являются фундаментальных типов данных (типов int, double и т.д.) или указателями, — должны передаваться по (константной) ссылке в функцию. Фундаментальные типы данных должны передаваться по значению в случае, если функция не будет изменять их значений.

Правило: Переменные нефундаментальных типов данных и не являющиеся указателями, передавайте в функцию по (константной) ссылке.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (285 оценок, среднее: 4,95 из 5)
Загрузка...

Комментариев: 12

  1. Сергей:

    Из книги Джеффа Элджера:

    Последнее присваивание норм?

  2. Дмитрий:

    Очень хорошие уроки у авторов. Спасибо вам большое за хороший перевод. Очень хорошо дополняет книгу С++ базовый курс (Липпман).

    1. Юрий:

      Пожалуйста 🙂

  3. Константин:

    А ссылку на массив сделать можно?
    Соре я немного тупой)

    1. Andrey:

      Можно через авто, но будет указывать толькл на первое значение))

      1. Томас:

        Действительно можно через auto, и можно даже индексировать, для получения разных элементов массива, при этом если вывести ссылку на экран, можно увидеть, что она содержит адрес массива, как указатель (что логично, потому что, как говорилось в уроках, массивы и указатели практически одно и то же, поэтому при обращении к массиву, мы получаем адрес первого его элемента).
        При этом инкрементировать как указатель её нельзя, в общем получается ни рыба, ни мясо, лучше просто использовать обычные указатели)

  4. Дмитрий:

    А как правильно передать массив в функцию? Писать амперсант или не обязательно?

    1. Анастасия:

      В главе про связь указателей и массивов было сказано, что лучше всего передавать массив в функцию как указатель. Например, так: void doSomething(int *array)

    2. Анастасия:

      В любом случае при передаче массива в функцию он передаётся как указатель и поэтому при изменении его значений, они реально будут меняться. Насколько я понимаю, как константу массив в функцию передать нельзя.

      1. Константин:

        Если я правильно понял Ваши сомнения:

  5. Vlados_Bro:

    Дякую, інформативно

    1. Юрий:

      Будь ласка, заходьте — читайте 🙂

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *