|
Программирование >> Дополнительные возможности наследования
3. Унаследуйте новое исключение от исключения, полученного в упражнении 2. Измените блок оператора oatoh таким образом, чтобы в нем происходила обработка как производного, так и базового исключений. 4. Измените код упражнения 3, чтобы получить трехуровневый вызов функции. 5. Яки: что не правильно в следуюшем коде? #lnoludi string класс строк class xOutOfMamory { public; xOutOfMemoryО{ theMsg = new char[203; strcpy(theMsg, error in memory );} xOutOfMemoryOf delete [] theMsg; cout Memory restored, endl; } char * MessageO { return theMsg; } private; char theMsg; > ; mainO { try { char var = new char; if ( var == 0 ) xOutOfMemory * px = new xOutOfMemory; throw px; catchC xOutOfMemory * theException ) { cout theExceptlon->Message() endl; delete theException; return 0; 6. Данный пример содержит потенциальную ошибку, подобную возникающей при попытке выделить память для показа сообщения об ошибке в случае обнаружения нехватки свободной памяти. Вы можете протестировать эту программу, изменив строку If (var == 0) на if (1), которая вызовет создание исключения. Что дальше Примите наши поздравления! Вы почти завершили изучение полного трехнедельного интенсивного курса введения в С++. К этому моменту у вас должно быть ясное понимание языка С++, но в современном программировании всегда найдутся еше не изученные области. В этой главе будут рассмотрены некоторые опущенные выше подробности, а затем намечен курс для дальнейшего освоения С++. Большая часть кода файлов источника представлена командами на языке С++. Компилятор превращает этот код в программу на машинном языке. Однако перед запуском компилятора запускается препроцессор, благодаря чему можно воспользоваться возможностями условной компиляции. Итак, сегодня вы узнаете: Что представляет собой условная компиляция и как с ней обращаться Как записывать макросы препроцессора Как использовать препроцессор для обнаружения ошибок Как управлять значениями отдельных битов и использовать их в качестве флагов Какие шаги следует предпринять для дальнейшего эффективного изучения С++ Препроцессор и компилятор При каждом запуске компилятора сначала запускается препроцессор, который ищет команды препроцессора, начинающиеся с символа фунта (#). При выполнении любой из этих команд в текст исходного кода вносятся некоторые изменения, в результате чего создается новый файл исходного кода. Этот новый файл является временным, и вы обычно его не видите, но можете дать команду компилятору сохранить его для последующего просмотра и использования. Компилятор читает не исходный файл источника, а результат работы препроцессора и компилирует его в исполняемый файл программы. Вам уже приходилось встречаться с директивой препроцессора sinclude: она предписывает найти файл, имя которого следует за ней, и вставить текст этого файла по месту вызова. Этот эффект подобен следующему: вы полностью вводите данный файл прямо в свою исходную программу, причем к тому времени, когда компилятор получит исходный код, файл будет уже на месте. Просмотр промежуточного файла Почти каждый компилятор имеет ключ, который можно устанавливать или в интегрированной среде разработки, или в командной строке. С помощью этого ключа можно сообщить компилятору о том, что вы хотите сохранить промежуточный файл. Если вас действительно интересует содержимое этого файла, обратитесь к руководству по использованию компилятора, чтобы узнать, какие ключи можно для него устанавливать. Использование директивы #define Команда #define определяет строку подстановки. Строка #define BIG 512 означает, что вы предписываете препроцессору заменять лексему BIG строкой 512 в любом месте программы. Эта запись не является командой языка С++. Строка 512 вставляются в исходную профамму везде, где встречается лексема BIG. Лексема - это строка символов, которую можно применить там, где может использоваться любая строка, константа или какой-нибудь другой набор символов. Таким образом, при записи строк fldefine BIG 512 int nyArray[BIG]; промежуточный файл, создаваемый препроцессором, будет иметь такой вид: int пуАггау[512]; Обратите внимание, что в коде исчезла команда ((define. Из промежуточного файла все директивы препроцессора удаляются, поэтому они отсутствуют в конечном варианте кода источника. Использование директивы #1вГтв для созданоя констант Один вариант использования директивы #define - это создание констант. Однако этим не стоит злоупотреблять, поскольку директива #define просто выполняет замену строки и не осуществляет никакого контроля за соответствием типов. Как пояснялось на занятии, посвященном константам, гораздо безопаснее вместо директивы ftdefine использовать ключевое слово const. Использованов дорвктовы #1вЛпв для твстнрования Второй способ использования директивы ttdefine состоит в простом объявлении того, что данная лексема определена в профамме. Например, можно записать следующее: ttdefine BIG В профамме можно проверить, была ли определена лексема BIG, и предпринять соответствующие меры. Для подобной проверки используются такие команды препроцессора, как #ifdef (если определена) и ftifndef (если не определена). За обеими
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |