Программирование >>  Операторы преобразования типа 

1 2 3 4 [ 5 ] 6 7 8 ... 239


Использование идентификатора, входящего в пространство имен josuttis;:F11e obj:

josuttis: ;iTiyGlobalFunc();

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

Обратите внимание: механизм называется обработкой исключений, а не обра боткой ошибок. Эти два понятия не всегда эквивалентны. Например, ошибки в данных, введенных пользователем, нередко рассматриваются не как исключение, а как вполне типичное явление. Вероятно, в таких случаях ошибки пользовательского ввода стоит обработать локально с использованием традиционные средств обработки ошибок.

Чтобы указать, какие исключения могут генерироваться функцией, включите в ее объявление спецификацию исключений:

void f() throw(bad alloc): fO генерирует только исключения bad alloc

Пустой список означает, что функция вообще не может создавать исключения: void f() throwO; f() не создает исключения

При нарушении спецификации исключений программа выполняет специальные действия (см. описание класса bad exception на с. 44),

В стандартную библиотеку С-и- включены некоторые обпше средства обработки исключений, в том числе стандартные классы исключений и класс auto j3tr (см, с. 43 и 54).

Пространства имен

с появлением новых библиотек, модулей и компонентов возрастает вероятность конфликтов имен при их одновременном испо.льзовании. Пространства имен помогают решить эту проблему.

Пространство имен объединяет идентификаторы в именованной области видимости. При этом имя пространства является единственным глобальным идентификатором, который может конфликтовать с другими глобальными именами. По аналогии с членами классов идентификаторы, входящие в пространство имен, уточняются именем этого пространства с оператором ::, как показано ниже:

Определение идентификаторов в пространстве имен josuttis namespace josuttis {

class File;

void myGlobalFuncC);



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

Если какие-либо типы аргументов определены в пространстве имен, в котором определена функция, то при вызове функции уточнять пространство имен не обязательно (так называемое правило Кенига). Пример:

Определение идентификаторов в пространстве имен josuttis class File:

void myGlobalFunc( const РПе&):

josuttis;:F11e Obj;

niyGlobalFunc(obj): По правилу Кенига функция josuttisinnyGlobalFunc

будет успешно найдена

Объявление using помогает избежать утомительных многократных повторений уточняющего префикса. Например, следующее объявление означает, что в текущей области видимости идентификатор File является локальным синонимом для josuttis: :File:

using josuttis:;File;

С другой стороны, директива using открывает доступ ко всем именам заданного пространства имен так, как если бы они были объявлены за его пределами. Это может привести к возникновению обычных конфликтов. Например, представленная ниже директива делает идентификаторы File и myGlobalFunc() глобальными в текущей области видимости:

using namespace josuttis;

Если в глобальной области видимости уже существуют идентификаторы RIe или myGlobalFuncO, то при использовании имен из пространства josuttis без уточняющих префиксов компилятор сообщает о неоднозначности ссылки.

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

В стандартной библиотеке С-и- все идентификаторы определяются в пространстве имен std. За дополнительной информацией обращайтесь на с. 40.



Тип bool

Для упрощения работы с логическими (булевыми) переменными в стандартную библиотеку включен тип bool. Использование типа bool делает программу более наглядной и позволяет переопределять поведение логических величин. Логические значения представляются литералами true и false; поддерживают преобразования типов из bool к целому типу и обратно. Ноль эквивалентен false, любое другое число эквивалентно true.

Ключевое слово explicit

Ключевое слово explicit запрещает автоматическое преобразование типа для конструктора с одним аргументом. Типичный пример ситуации, в которой это необходимо, - класс коллекции (например, стек), конструктору которого при вызове передается начальный размер коллекции:

class Stack {

explicit StackCint size): Создание стека с заданным

исходным размером

В данном случае ключевое слово explicit прает очень важную роль. Без explicit этот конструктор автоматически определял бы преобразование типа из int в Stack. В этом случае объектам типа Stack можно было бы присваивать тип int:

Stack s;

s = 40: Команда создает новый стек на 40 элементов и присваивает его s.

В результате автоматического преобразования типа число 40 преобразуется в стек из 40 элементов, а результат присваивается s. Вряд ли это именно то, что предполагалось. Но если объявить конструктор int с ключевым словом explicit, попытка присваивания вызовет ошибку на стадии компиляции.

Учтите, что слово explicit также исключает инициализацию с автоматическим преобразованием типа при присваивании:

Stack sl(40): OK

Stack S2 = 40; ОШИБКА

Дело в том, что между следующими двумя парами строк существует тонкое различие:

X х:

Y у(х): Явное преобразование X х:

Y у = X; Неявное преобразование

В первом фрагменте новый объект типа Y создается явным преобразованием от типа X, тогда как во втором фрагменте новый объект типа Y создается с неявным преобразованием.



1 2 3 4 [ 5 ] 6 7 8 ... 239

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