Получение строки с завершающим нулем
Несмотря на неоспоримую полезность объектов типа string , возможны ситуации, когда вам придется получать из такого объекта символьный массив с завершающим нулем, т.е. его версию С‑строки. Например, вы могли бы использовать string ‑объект для создания имени файла. Но, открывая файл, вам нужно задать указатель на стандартную строку с завершающим нулем. Для решения этой проблемы и используется функция‑член c_str() . Вот как выглядит ее прототип:
Эта функция возвращает указатель на С‑версию строки (т.е. на строку с завершающим нулевым символом), которая содержится в вызывающем объекте типа string . Полученная строка с завершающим нулем изменению не подлежит. Кроме того, после выполнения других операций над этим string ‑объектом допустимость применения полученной С‑строки не гарантируется.
Хранение строк в других контейнерах
Поскольку класс string определяет тип данных, можно создать контейнеры, которые будут содержать объекты типа string . Рассмотрим, например, более удачный вариант программы‑словаря, которая была показана выше.
И еще об STL
Библиотека STL – важная составляющая языка C++. Многие задачи программирования можно описать, используя терминологию STL. Эта библиотека великолепно сочетает силу своих средств с гибкостью их применения. Несмотря на то что ее синтаксис немного сложноват, он быстро осваивается. Ни один уважающий себя С++‑программист не может пренебречь возможностями библиотеки STL, поскольку она – не только настоящее, но и будущее С++‑программирования.
|
|
Глава 22: Препроцессор C++
Заключительная глава книги посвящена описанию препроцессора C++. Препроцессор C++ – это часть компилятора, которая подвергает вашу программу различным текстовым преобразованиям до реальной трансляции исходного кода в объектный. Программист может давать препроцессору команды, называемые директивами препроцессора (preprocessor directives), которые, не являясь формальной частью языка C++, способны расширить область действия его среды программирования.
Препроцессор C++ включает следующие директивы.
Как видите, все директивы препроцессора начинаются с символа '#' .Теперь рассмотрим каждую из них в отдельности.
На заметку. Препроцессор C++ – прямой потомок препроцессора С, и некоторые его средства оказались избыточными после введения в C++ новых элементов. Однако он по‑прежнему является важной частью С++‑среды программирования.
Директива #define
Директива #define определяет имя макроса.
Директива #define используется для определения идентификатора и символьной последовательности, которая будет подставлена вместо идентификатора везде, где он встречается в исходном коде программы. Этот идентификатор называется макроименем, а процесс замены – макроподстановкой (реализацией макрорасширения). Общий формат использования этой директивы имеет следующий вид.
|
|
Обратите внимание на то, что здесь нет точки с запятой. Заданная последовательность_символов завершается только символом конца строки. Между элементами макроимя (имя_макроса) и последовательность_символов может быть любое количество пробелов.
Итак, после включения этой директивы каждое вхождение текстового фрагмента, определенное как макроимя , заменяется заданным элементом последовательность_символов . Например, если вы хотите использовать слово UP в качестве значения 1 и слово DOWN в качестве значения 0 , объявите такие директивы #define .
Данные директивы вынудят компилятор подставлять 1 или 0 каждый раз, когда в файле исходного кода встретится слово UP или DOWN соответственно. Например, при выполнении инструкции:
На экран будет выведено следующее:
После определения имени макроса его можно использовать как часть определения других макроимен. Например, следующий код определяет имена ONE , TWO и THREE и соответствующие им значения.
|
|
Важно понимать, что макроподстановка – это просто замена идентификатора соответствующей строкой. Следовательно, если вам нужно определить стандартное сообщение, используйте код, подобный этому.
Препроцессор заменит строкой "Введите имя файла" каждое вхождение идентификатора GETFILE . Для компилятора эта cout‑инструкция
в действительности выглядит так.
Никакой текстовой замены не произойдет, если идентификатор находится в строке, заключенной в кавычки. Например, при выполнении следующего кода
на экране будет отображена эта информация
а не эта:
Если текстовая последовательность не помещается на строке, ее можно продолжить на следующей, поставив обратную косую черту в конце строки, как показано в этом примере.
Среди С++‑программистов принято использовать для макроимен прописные буквы. Это соглашение позволяет с первого взгляда понять, что здесь используется макроподстановка. Кроме того, лучше всего поместить все директивы #define в начало файла или включить в отдельный файл, чтобы не искать их потом по всей программе.
|
|
Макроподстановки часто используются для определения "магических чисел" программы. Например, у вас есть программа, которая определяет некоторый массив, и ряд функций, которые получают доступ к нему. Вместо "жесткого" кодирования размера массива с помощью константы лучше определить имя, которое бы представляло размер, а затем использовать это имя везде, где должен стоять размер массива. Тогда, если этот размер придется изменить, вам достаточно будет внести только одно изменение, а затем перекомпилировать программу. Рассмотрим пример.
Важно! Важно помнить, что в C++ предусмотрен еще один способ определения констант, который заключается в использовании спецификатора const. Однако многие программисты "пришли" в C++ из С‑среды, где для этих целей обычно использовалась директива #define. Поэтому вам еще часто придется с ней сталкиваться в С++‑коде.
Дата добавления: 2018-09-22; просмотров: 277; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!