#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);
Обратите внимание, что редко возникает необходимость использовать ссылки на целые числа, так как обычно вас интересует только значение целого числа и не заботит идентификатор объекта.
Косвенность, которую обеспечивают ссылки и указатели, делает возможным полиморфизм во время выполнения. Вы узнаете об этом, когда будете изучать объектно-ориентированное программирование.