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

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

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

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

В конце печатается результирующая таблица введенных слов вместе с числами их повторов. Например, если на входе были слова аа ЬЬ ЬЬ аа аа ЬЬ аа аа то программа выдаст следующую статистическую информацию: аа: 5 ЬЬ: 3 Несложно переделать представленное решение в настоящий ассоциативный массив на базе классового шаблона с перегруженной операцией [) (811.8). Еше проще воспользоваться типом тар из стандартной библиотеки (8! 7.4.1). рая поддерживает структуру данных, содержащую ровно один элемент типа Раи для каждой уникальной строки, переданной этой функции. Чтобы не затягивать рассмотрение вопроса, приведем очень простую (и неэффективную) реализацию: гестот<Ра!т> р!ь!гз; 148 Глава 5 Указатели, массивы и структуры 5.6.

Тип чоЫ* Переменной типа юЫ* можно присвоить значение указателя любого типа; одной переменной типа юЫ* можно присваивать значение другой переменной этого типа, а также сравнивать их между собой на равенство (или неравенство); тип ю!д* можно явным образом преобразовывать в указатели иных типов. Другие операции с типом юЫ* опасны, так как компилятор не знает типа адресуемых объектов, и поэтому такие операции вызывают ошибку компиляции. Чтобы воспользоваться указателем типа юЫ*, его нужно явно преобразовать к иным типам указателей. Например: чоЫ( (1п(* р(') чоЫ* рч = р('( *Рч( рч»»( У о)с' неявное преобразование из (п(» в чо1д» // еггог: нельзя разыменовать чоЫ* У еггог: нельзя инкрементировать чо1д» /У (неизвестен размер указуемого объекта) Ы(* р(2 = з(аде саз(к(п(*> (рч) //явное преобразование в (п(» ((оиЫе* рИ1 = рч( // е(тог доиЫе* р((2 = р(; //елог йоиЫе* рдЗ = з(апс саз(<ИоиЫе*> (рч) ( У небезопасно чоЫ* ту аПос((1(е (и); //выделить п байт из моей специальной кучи К наличию чоЫ» на более высоких уровнях программного обеспечения следует относиться с подозрением — скорее всего это следствие ошибок проектирования.

Если юЫ используется для оптимизации, то его лучше скрыть за фасадом безопасного интерфейса 1813.5, 824.4.2). Указатели на функции Я7.7) и указа(пели на члены классов (815.5) не могут присваиваться переменным типа юЫ». В обшем случае небезопасно использовать указатель, приведенный к типу, отличному от типа адресуемого объекта. К примеру, под тип доцЫе на многих машинах отводится 8 байт. Тогда работа с указателем рдЗ будет непредсказуемой, так как р( указывает на блок памяти, выделенный под Ы( )обычно 4 байта). Операция в(апс саз( для явного преобразования типов указателей внутренне опасна и внешне выглядит «безобразно», но так и было задумано, чтобы своим внешним видом она напоминала о реальной опасности преобразования. В основном, тип юЫ» применяется в параметрах функций, которым не позволено делать предположения о типе адресуемых объектов, и для возврата из функций «бестиповых» объектов.

Чтобы воспользоваться таким объектом, нужно явно преобразовать тип указателя. Функции, используюшие юЫ», типичны для самых нижних слоев системного обеспечения, где ведется работа с аппаратными ресурсами компьютера. Например: 149 5.7. Структуры 5.7. Структуры Массив — это агрегат (набор) элементов одинакового типа. А структура — это агрегат элементов (почти) произвольных типов.

Например: Здесь определяется новый тип с именем айй«езв, состоящий из полей, которые необходимо заполнить для отправки письма. Обратите внимание на точку с запятой в конце определения. Для языка С++ это довольно редкий случай, когда после закрывающей фигурной скобки нужно ставить точку с запятой, так что люди часто забывают о ней, а это вызывает ошибку компиляции. Переменные типа аййгевв можно объявлять точно так же, как и другие переменные, а индивидуальные поля (члены — тетЬе«з) достижимы с помощью операции . (операция точка — йог оре«агог).

Например: го1й г"[) [ аййевв1й; 1й. пате = КР1т Раийу"; 1й. питЬе« = 61; ) Конструкция, использованная нами ранее для инициализации массивов (95.2.1) применима и для инициализации переменных структурных типов. Например: аййгетр1 = [ "э[т Раийу", 61, "Бои«Ь Я", ")чем Ргогзйеисе", [ 'Л", 'У' ), 7974); Впрочем, конструкторы обычно подходят лучше (э" 10.2.3). заметьте, что уй. вгаге нельзя инициализировать строкой "ЖУ'. Строки оканчиваются терминальным символом ' ~0'.

Следовательно, "ЛУ' содержит три символа — на один больше, чем можно разместить в уй.агате. К объектам структурных типов часто обращаются с помощью указателей, используя операцию -> (операцил розыменовонил указателей но структуры — зг«исги«е ро[иге«йе«е(е«сисе оре«о1ог). Например: гогй реги« аййг [аййгевв* р) [ соне«р->пате « ' ~и ' «р->питЬег « ' ' « р->Мгеег « ' ~~и' «р->гоми « '',и' «р->вгаге [01«р->«лаге [1] « ' ' «р->цр« ' ~п '; есгисг аййгеев [ сйаг* нате; !опя (и«питЬег; слог* «4 еем сйаг* гоши; слог Ма«е [1); 1опе ир; )' 77 'Лт Рапйу" 77 б! ,У "Яои)Ь 5)" 77 п№ш Ргогййеисе" 77 'Ф' гр 77 7974 Глава 5.

Указатели, массивы и структуры Для указателя р выражение р->т эквивалентно выражению ('р) .т. ' Обьекеы структурных типов можно присваивать, передавать в функции и воэвраи(ать из функций. Например: ад Ь евв сиггеп11 аддгевв ве1 вигген (аддгевв пвхг) ( аИгевв ргвг = сиггепгг сиггеп1 = псх1; гегигп ргвг1 ) Другие операции, например операции сравнения (== и '. =), не определены. Однако пользователь (программист) может определить их сам (глава 11). Размер обьекта структурного типа не обязательно равен сумме размеров полей структуры, так как для разных машинных архитектур нужно в обязательном порядке или целесообразно (для эффективности) располагать объекты определенных типов, выровненными по заданным границам. Например, целые часто располагаются на границах машинных слов.

При этом говорят, что объекты надлежащим образом выровнены (а11япед) в памяти компьютера. Это приводит к «дырам» в структурах. Например, для многих машин окажется, что я(хеог'(айЬ ем) равен 24, а не 22, как можно было бы ожидать. Можно попытаться минимизировать неиспользуемое пространство, отсортировав поля по убыванию их размера. Однако все же лучше упорядочивать поля структур из соображений наглядности, а сортировку по размеру производить лишь в случае жестких требований по оптимизации. Имя нового типа можно использовать сразу же после его появления, а вовсе не после его полного определения.

Например: виисг Е1пй ( Хгпа* ргег(оив; Сспа* виссеввогг )1 До окончания полного определения типа нельзя обьявлять обьекты или поля этого типа. Например: вггис1 )Уо доод ( )Уо аоод тетвег; йеггог: рекурсивное определение )1 Тут возникает ошибка компиляции, ибо компилятор не знает, сгсолько памяти нужно отвести под Жо явой. Чтобы позволить двум (и более) структурным типам ссылаться друг на друга, достаточно объявить, что некоторое имя является именем структурного типа. Например: лиисг Аюв11 У определение будет дано ниже гвгисг А)па ( Ппа* рге; 5.7.

Структуры 151 Ь(на* зис; лязг* тетЬег отг Без предварительного обьявления имени Бьзт использование этого имени в объявлении структуры Х(пк привело бы к ошибке компиляции. Именем структурного типа можно пользоваться до его полного определения в случаях, когда нет обращений к полям структуры или нет необходимости знать размер типа. Например: УУ Я - это имя некоторого типа с(азэ б; Тем не менее, многим объявлениям требуется полное определение типа: Структуры являются упрощенными классами (глава (0). По причинам, уходящим корнями глубоко в предысторию языка С, разрешается совмещать имена структурного типа и иных программных конструкций в рамках одной и той же области видимости. Например: э(гас(маг( /* ...

*У ); Ьм маг (сяаг* пате, з(гисг маг* Ьиз) В этом случае, просто имя згаг относится к неструктурным конструкциям, а имя структуры должно предваряться ключевым словом зп иск Аналогично, требуется использовать ключевые слова сгазэ, ип(оп (ВС.8.2) и епит (84.8) с целью преодоления возникающих неоднозначностей. Лучше, однако, избегать такого конфликта имен. зсгисг Биг ( Ппа* Йеадг ехгегп Я а; ЯХ(): гоЫ я (5); Я* Ь (Я*); го(д Ь(Я* р) ( Я аз .Г(): е(а); р-эт = 7; б* д = Ь (р); а->т = 7; ) УУ еп оп Я не определен и его размер неизвестен УУ епог: 5 не определен, а его размер нужен УУ для возвращаемого значения УУ еп ог: Я не определен, а его размер нужен для передачи аргумента УУ еггог: Я не определен и его члены неизвестны У оЕ с указателями проблем нет УУ ег.ог: Я не определен и его члены неизвестны 152 Глава 5.

Указатели, массивы и структуры 5.7.1. Эквивалентность типов Две структуры являются разными типами, даже если у них поля одинаковые. Например, структуры вггисг И ( гпг а; 1; вп нег 52 11пг а; 1; являются разными типами, так что следующий код ошибочен: 51 хг лгу=к; О' еггог: несоответствие типов Структуры разнятся также и от фундаментальных типов: 51 х; Ыг 1 = х; //еггог несоответствие типов Каждая структура должна иметь единственное определение в программе (89.2.3). 5.8. Советы 1. Избегайте нетривиальной арифметики указателей; 85.3. 2. Внимательно отслеживайте потенциальную возможность выхода за границы массива; 85.3.!.

3. Используйте д вместо )УЕ/АА; 85.1.1. 4. Используйте типы гесгог и га!аггау вместо встроенных (в С-стиле) массивов; $5.3.1. 5. Используйте вп)пя, а не массивы сваг с терминальным нулем„85.3. б. Минимизируйте применение простых ссылок для аргументов функций; 85.5. 7. Применяйте юЫ* лишь в низкоуровневом коде; 85.6. 8. Избегайте нетривиальных литералов («магических чисел») в коде — используйте символические макроконстанты; 84.8, 85.4.

5.9. Упражнения 1. (*1) Напишите следующие объявления: указатель на символ, массив из 10 целых, ссылка на массив из 1О целых, указатель на массив строк, указатель на указатель на символ, целая константа, указатель на целую константу, константный указатель на целое. Проинициализируйте все объекты.

2. (*1.5) Каковы на вашей системе ограничения на значения указателей типа сйаг*, тг* и юЫ*? Например, может ли 1пг* иметь нечетное значение (подсказка: подумайте о выравнивании)? 3. (*1) Используйте гуре4ег'для определения типов: ипв(дпе4 сйаг, сопят ипвгяпе4 сИаг, указатель на целое, указатель на указатель на сваг, указатель на массив ейаг, массив из 7 указателей на Ыб указатель на массив из 7 указателей на )пг и массив из 8 массивов по 7 указателей на целые. 5.9. Упражнения 6.

8. 9. 10. 11. 12. 13. ('1) Напишите функцию, которая обменивает значения у двух целых чисел. Используйте аргументы типа (л(*. Напишите другой вариант с аргументами типа (п(ь. (*1.5) Каков размер массива з(г в следуюшем примере: сйог з(г(] = "о зйог( о(г(ли"; Какова длина строки "а зйог( з(г(ля"? ("1) Определите функции /(ейаг], и(ейага] и й(соло( сйага).

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

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

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

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