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

1 ... 19 20 21 [ 22 ] 23 24 25 ... 239


Вспомогательные операторы сравнения 83

public:

bool operator== (const X& x) const; bool operator< (const Х& x) const;

void fooC) {

using namespace std::rel ops: Получение доступа к !=. > и т. д X х1. х2:

if (xl != х2) { )

if (xl > х2) { )

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

using namespace std: Операторы не переходят

в глобальную область видимости

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

using namespace std::rel ops: Операторы находятся в глобальной

области видимости.

В некоторых реализациях шаблоны операторов определяются с двумя разными типами аргументов:

namespace std (

template <class Tl. class T2> inline bool operator!=(const T1& x. const T2& y) { return !(x -= y):



Преимущество такой реализации - возможность использования разнотипных операндов (при условии совместимости типов). Однако следует учитывать, что подобные реализации не поддерживаются стандартной библиотекой С++, поэтому в случае их применения программа утрачивает переносимость.

Заголовочные файлы <cstclclef> и <cstdlib>

В программах С++ часто используются два заголовочных файла, совместимых с С: <cstddef> и <cstdlib>. Они представляют собой обновленные версии заголовочных файлов <stddef.h> и <stdlib.h> языка С и содержат определения некоторых распространенных kohctiht, макросов, типов и функций.

Определения <cstdldlef>

в табл. 4.5 перечислены определения из заголовочного файла <cstddef>. Определение NULL часто используется для обозначения указателя, ссылающегося на ничто . Оно соответствует значению О (в виде типа int или long). В языке С значение NULL часто определяется как (void*)0, но в С++ такое определение неверно ~ тип NULL должен быть целочисленным, иначе присваивание указателю NULL станет невозможным. Дело в том, что в С++ не существует автоматического преобразования void* в любой другой тип Учтите, что NULL также определяется в заголовочных файлах <cstdio>, <cstdlib>, <cstring>, <ctinie>, <cwchar> и <clocale>.

Таблица 4.5. Определения <cstddef> Идентификатор Описание

NULL Неопределенное значение указателя

size t Беззнаковый тип для обозначения размеров (например, количества

элементов)

ptrdiff t Знаковый тип для разности указателей

offsetof() Смещение члена структуры или объединения

Определения <cstdllib>

в табл. 4.6 перечислены важнейшие определения из заголовочного файла <cstdlib>. Две константы - EXITSUCCESS и EXITFAILURE - определяются для аргумента функции exitO, но они также могут использоваться при возврате значения функцией main().

Из-за путаницы с NULL некоторые программисты и руководства по стилю программирования рекомеггдуют вообще отказаться от NULL в С++ и использовать О или специальную пользовательскую константу (иапри.мер, NIL). Впрочем, автор использует NULL в своих программах, в том числе и в примерах этой книги.



Таблица 4.6. Определения <cstdlib>

Идентификатор Описание

exit (int код) Выход из программы (с уничтожением статических объектов)

EXrr SiJCCESS Признак нормального завершения программы

EXrr FAILURE Признак ненормального завершения прсмраммы

abortQ Аварийное завершение программы (в некоторых системах может

привести к сбоям)

atexit (void (*функция)()) Вызов заданной функции при завершении

Функция atexitO регистрирует функции, которые должны быть вызваны при завершении программы. Вызов происходит в порядке, обратном порядку регистрации, и без передачи аргументов. Программа может быть завершена как вызовом exit(), так и при достижении конца функции niain().().

Функции exit() и abort() позволяют завершить программу в любой функции без возврата в niain().

О Функция exitO уничтожает все статические объекты, сбрасывает на диск содержимое буферов, закрывает псе каналы ввода-вьгаода и завершает программу с вызовом функций, зарегистрированных функцией atexit(). Если в зарегистрированных функциях происходят исключения, вызывается функция terminate().

О Функция abortO немедленно прекращает работу программы без выполнения завершающих действий.

Ни одна из этих функций не уничтожает локальные объекты, поскольку раскрутка стека не выполняется. Чтобы обеспечить вызов деструкторов всех локальных объектов, воспользуйтесь исключениями или обычным механизмом возврата и выхода из mainO.



1 ... 19 20 21 [ 22 ] 23 24 25 ... 239

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