Главная » Просмотр файлов » Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)

Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033), страница 31

Файл №1004033 Бьерн Страуструп. Язык программирования С++. Специальное издание (2011) (Бьерн Страуструп. Язык программирования С++. Специальное издание (2011)) 31 страницаБьерн Страуструп. Язык программирования С++. Специальное издание (2011) (1004033) страница 312018-10-07СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 31)

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

Константы часто используются в качестве размера массивов и в качестве меток сазе-ветвей оператора з)в11сй. Например: сопл( 1пг а = 42; сони lпг Ь = 99; сонм 1пс тах = 128; 5.4. Константы 143 5.4.1. Указатели и константы В операциях с указателями участвуют сразу два объекта: указатель и объект, на который он ссылается. Помещение ключевого слова сопя( в начало объявления делает константным обьект, а не указатель. Для объявления указателя константой нужно применить декларатор *сопзг вместо просто звездочки.

Например: уо«~Ц7 (слог* р) ( айаг з(] = "Сост"; соли спас* рс = 5; рс(3) = 'я'; рс = р; //указатель на константу //еггог: рс указывает на константу // ой // константный указатель // Ой // еггог: ср есть константа сйаг* сопке ср = з; ср[3) = 'а'; ср=р; сопя( Сваг* сонм срс = з; / константный указатель на константу срс(3) = 'а'; //еггот срс указывает на константу срс = р; //еггог: срс есть константа ) Подчеркнем, что константой указатель делает именно декларатор *сопят. Никакого декларатора сопзг не существует, так что ключевое слово сопят, расположенное перед звездочкой, относится к базовому типу.

Например: / константный указатель на снег //указатекь на константу типа сваг //указатель на константу типа снаг сйаг* сонм ср; айаг сопя(* рс; сопке спас* рс2( В подобного рода случаях часто альтернативой константам служат перечисления 64.8). Как ключевое слово сопи применяется к функциям-членам классов, рассказывается в З10.2.6 и З!0.2.7. Символические константы следует использовать систематически, дабы избегать появления «магических чисел» в программном коде. Если такое число обозначает, например, размер массива, то будучи многократно продублированным непосредственно в коде, оно вызовет серьезные затруднения при модификации программы, так как потребуется выявить и правильно изменить каждое его вхождение. Использование символических констант локализует информацию.

Часто числовые константы означают некоторые предположения о работе программы. Например, число 4 может означать количестве байт в целом типе, 128 — емкость буфера ввода, а 6.24 — обменный курс датской кроны по отношению к доллару США. Тому, кто впоследствии сопровождает программу, понять смысл числовых литералов бывает довольно трудно. Часто на такие числа не обращают должного внимания при переносе программ в иные среды, или при иных модификациях программ, нарушающих первоначальные предположения, что в итоге приводит к весьма неприятным ошибкам. Хорошо прокомментированные символические константы сводят указанные проблемы к минимуму.

144 Глава 5. Указатели, массивы и структуры Некоторые люди находят удобным читать такие объявления справа налево. Например, «ср это константный указатель на айаг», или «рс2 есть указатель на айаг константный». Объект может быть константным при обращении к нему через некоторый указатель, и обычной переменной при иных способах доступа. Это широко используется в контексте параметров функций. Если у функции параметр-указатель объявлен константным, то функция лишается возможности изменять адресуемое им значение.

Например: сваг* з!геру(айаг* р, сопи айаг* 4); /У не может модифицировать «ц Вы можете присвоить адрес переменной указателю на константу, поскольку от такого присваивания не будет никакого вреда. Противоположное неверно: нельзя присвоить адрес константы обычному (неконстантному) указателю, ибо в противном случае с его помощью можно было бы изменить значение константь). Например: /У о/с УУ о/с за!* рЗ = ьс; У еггот инициализация переменной типа т/" //значением типа сопл! т!* //попытка изменить значение константы с *рЗ= У) ) Снять ограничения на применение указателей на константы можно с помощью явного приведения типа (510.2.7.1 и 515.4.2.1). 5.5.

Ссылки Ссылка (ге1егепсе) является альтернативным именем объекта. Ссылки чаще всего используются для объявления параметров и возвращаемых значений у функций вообще, и у перегруженных операций (глава 11) в частности. Обозначение Хв означает ссылку на Х (ге~егепсе !о Х). Например: Чтобы гарантировать привязанность ссылки к некоторому объекту, мы обязаны ее инициализировать. Например: зпгз = 1; !и!ь г1 = !; УУ о/с г/ инициализировано иоЫ/4() ( йиа =1; сопл! !зм е = 2/ сопл! зп!* р1 = ьс/ сонм из!* р2 = ьа; иоЫ /'() ( йм!=1; !и!ь г=!; !и!х = г; г= 2; У/г и 1' теперь ссылаются на одно и то же целое Ух=! УУ!=2 5 5 Ссылки 145 Ыеь ге екеегн 1пеь ггЗ) Е! етгот: отсутствует инициализатор У олс г3 инициализируется в другом месте Инициализация ссылок это не то же самое, что присваивание.

Несмотря на обманчивую видимость, ни одна операция не выполняется над самой ссылкой. Например: ~7 й увеличивается на 1 Ебрр указывает на й Здесь все выражения допустимы, но в результате г++ увеличивается не ссылка и, а адресуемая этой ссылкой переменная й целого типа. Следовательно, значение ссылки никогда не меняется после инициализации; она всегда ссылается на объект, с которым была проинициализирована. Чтобы получить указатель на объект, с которым связана ссылка ег, можно использовать выражение ьгг.

Очевидной гипотетической реализацией ссылки может служить (константный) указатель, который автоматически (неявно) разыменуется при использовании. Большого вреда в такой интерпретации нет, особенно если всегда помнить, что над ссылками нельзя выполнять операции так же, как над указателями: В ряде случаев компилятор может так оптимизировать код, что в момент исполнения программы ей не будет соответствовать никакого объекта в памяти. Инициализация ссылок тривиальна, когда инициализатор представляет из себя !га!ие (объект, адрес которого можно получить; В4.9.6). Инициализатором для типа Ть должен быть 1га1ие типа Т. Инициализатор для типа союг Ть не обязан следовать этому правилу и даже может вообще не иметь тип Т. В таких случаях: 1.

Если необходимо, выполняется неявное преобразование к типу Т(ВС.6). 2. Результирующее значение помещается во временную переменную типа Т. 3. Временная переменная используется в качестве инициализатора. Рассмотрим пример; доиЫеь д = 1; сопл! доиЫеь сдг = 1) УЕ егтоте требуется !та!ие тз' ОА. Можно интерпретировать последнюю инициализацию следующим образом: доиЫе гетр = доиЫе (1); сопле Йоий1еь сдг = гетре Временная переменная, созданная для хранения инициализатора ссылки, существует до тех пор, пока ссылка не выйдет из своей области видимости.

го(д я () ( епгй = 0) 1пеь ет = й'; гтч-+; 1пе* рр = ьгге ) дсоздаем временную переменную с нузкньем значением дзатем используем ее для инициализации сд Глава 5. Указатели, массивы и структуры 146 Видно, что ссылки на константы и ссылки на переменные серьезно различаются, так как введение временных переменных в последнем случае приводило бы к неприятным ошибкам: изменение исходной переменной влечет за собой изменение быстро исчезающей временной переменной.

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

Например: гоИ гпсгетеп((1лп аа) ( ааеег гоЫ1 ( ) ( 1лгх = 1; Ысгетеп (х); ) ~Ух=2 Семантика передачи аргументов аналогична инициализации, так что при вызове функции 1лсгетелг() аргумент аа становится другим именем для х. Для улучшения читаемости программ лучше избегать функций, изменяющих свои аргументы. Предпочтительнее использовать явным образом возврат функции или объявить аргумент указателем: ли пехг(1пгр) (гетгп ре1; ) гоЫ!пег (1п(* р) ( (*р) ее; ) гоЫ е() ( гпгх = 1> (лсгетеп (х); х = лехг(х); (пег ( ьх); ) /УхГ 1 ФхГ 3 рх=4 в)гисс Рай ( есгтя пате; ИоиЫе га1; Общая идея заключается в том, что строка имеет ассоциированное с ней числовое значение с плавающей запятой.

Несложно определить функцию га1ие(), кото- Внешний вид вызова 1псгетепг(х) не дает читателю и намека на то, что значение х будет изменено, в отличие от х = лехе(х) и тсг(ьх) . Так что ссылочные аргументы уместно использовать лишь в функциях, чьи имена прозрачно намекают на возможность модификации аргументов.

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

Сначала задаем структуру Раи следующим образом: 5.5. Ссылки 147 йоиЫеь га1ие (сопл! зтг!пяь з) /* поддерживает набор пар Ра!г: ищет строку з; если найдена, возвращает соответствующее значение; в противном случае создает новый Рай и возвращает О. См. также 311.В. */ ( азот(!п!1 = От 1 <райх.ясе (); !++) (у (з == ра(гз [1] . питие) ге!игп рапи [ 1) . га1; Ра(г р = (з, д ); ра!т.ризй Ьасй(р); //добавить Рас> в конец (33.73! гетигп рапи [раггз.

згее () -1) . га1; ) Здесь речь идет о построении массива чисел, индексируемых строками. Для заданного строкового аргумента функция га1ие() находит соответствующий числовой объект (именно объект, а не его значение) и возвращает ссылку на него. Вот пример использования функции га1ие(): 1п! та!и () ( зтг!пя Ьиу) // посчитать кол-во вхождений каждого слова во входном потоке тй11е(сгп»Ьи!) га!ие(Ьи33) ++) аког ( тес!от<ран >:: сонм йетатот р = ра!гз. Ьеясщ ( ); р! =рави . епа ( ); ++р ) сои!«р->пате « ": " «р->та! « ' ~п'; ) Здесь в каждой итерации цикла ий!1е из стандартного потока ввода с(и читается одно слово и записывается в строковый буфер ЬиУ (), после чего обновляется значение связанного с этим словом счетчика.

Характеристики

Тип файла
DJVU-файл
Размер
8,84 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6432
Авторов
на СтудИзбе
306
Средний доход
с одного платного файла
Обучение Подробнее