Как используются ссылки и указатели на константы?

#c

#c

Вопрос:

В книге C Primer я прочитал о ссылках на константы, подобные этим:

 const int ci = 1024;
const int amp;r1 = ci;
  

То же самое касается указателей.

 const double pi = 3.14;
const double *ptr = amp;pi;
  

Интересно, каково использование этих ссылок, если вы даже не можете изменить значение константы? Зачем вам вообще создавать указатель на константу?

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

1. «Зачем вам вообще понадобилось создавать указатель на константу?» Взять const char *s = "foobar"; . Это указатель на константу. Вы бы сказали, что это бесполезно?

2. Допустим, у вас очень большая структура, например, std::vector<int> из 10000 элементов. Допустим, вы хотите передать его в качестве аргумента функции, но функция не должна изменять содержимое вектора. Теперь, не могли бы вы передать его по значению и позволить копировать весь вектор при каждом вашем вызове? Или вы передали бы его по ссылке без какого-либо копирования векторных данных?

3. Есть также другие места, где ссылки или указатели полезны в C , наиболее примечательные полиморфизмом. Но для простых примеров, которые вы показываете, нет необходимости в ссылке или указателе.

4. этот пример слишком прост, поэтому в данном случае const double *ptr бесполезен.

5. Одна из целей семантики языка программирования — помочь разработчикам избежать ошибок при выражении своих намерений. const Ссылка или указатель позволяет выразить тот факт, что вы хотите передать ссылку на некоторые данные, которые не следует изменять.

Ответ №1:

Интересно, каково использование этих ссылок, если вы даже не можете изменить значение константы

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

Но передача константы в вызов функции (тем самым привязывая аргумент к этой константе) также полезна:

 void foo(const int amp;r1);

// call using a constant
foo(ci);
  

Обратите внимание, что редко возникает необходимость использовать ссылки на целые числа, так как обычно вас интересует только значение целого числа и не заботит идентификатор объекта.

Косвенность, которую обеспечивают ссылки и указатели, делает возможным полиморфизм во время выполнения. Вы узнаете об этом, когда будете изучать объектно-ориентированное программирование.