Программирование >>  Дополнительные возможности наследования 

1 ... 215 216 217 [ 218 ] 219 220 221 ... 265


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 (если не определена). За обеими



1 ... 215 216 217 [ 218 ] 219 220 221 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика