Читаем Программирование. Принципы и практика использования C++ Исправленное издание полностью

• начальное значение объявляемой сущности (во многих случаях необязательное).

Мы можем объявлять следующие сущности:

• объекты встроенных типов и типов, определенных пользователем (раздел A.8);

• типы, определенные пользователем (классы и перечисления) (разделы A.10–А.11, глава 9);

• шаблоны (шаблонные классы и функции) (раздел A.13);

• альтернативные имена (раздел A.16);

• пространства имен (разделы A.15 и 8.7);

• функции (включая функции-члены и операторы) (раздел A.9, глава 8);

• перечисления (значения перечислений) (разделы A.11 и 9.5);

• макросы (разделы A.17.2 и 27.8).

<p id="AutBody_Root599"><strong>A.7.1. Определения</strong></p>

Определение с инициализацией, резервирующее область памяти или как-то иначе поставляющую компилятору всю информацию, необходимую для использования имени в программе, называется определением (definition). Каждый тип, объект и функция в программе должны иметь только одно определение. Рассмотрим примеры.

double f;               // объявление

double f { /* ... */ }; // также определение

extern const int x;       // объявление

int y;                    // также определение

int z = 10;               // определение с явной инициализацией

Константы должны быть инициализированы. Для этого используется инициализатор, если константа не объявлена с помощью ключевого слова extern (в таком случае инициализатор вместе с определением должны быть расположены в другом месте) или если константа не имеет тип, имеющий конструктор по умолчанию (раздел A.12.3). Константные члены класса должны инициализироваться в каждом конструкторе с помощью инициализатора (раздел A.12.3). 

<p id="AutBody_Root600"><strong>A.8. Встроенные типы</strong></p>

 Язык C++ имеет много фундаментальных типов и типов, составленных из фундаментальных типов с помощью модификаторов.

Здесь T означает “некий тип”, поэтому существуют варианты long unsigned int, long double, unsigned char и const char* (указатель на константный символ char). Однако эта система не совсем полная; например, в ней нет типа short double (его роль играет тип float); типа signed bool (совершенно бессмысленного); типа short long int (это было бы лишним) и типа long long long long int. Некоторые компиляторы в ожидании стандарта C++0x допускают тип long long int (читается как “очень длинный целый тип ”). Гарантируется, что тип long long содержит не менее 64 бит.

Типы с плавающей точкой (floating-point types) — это типы float, double и long double. Они являются приближением действительных чисел в языке С++.

Целочисленные типы (integer types), иногда называемые интегральными (integral), — это типы bool, char, short, int, long и (в языке C++0x) long long, а также их варианты без знака. Обратите внимание на то, что тип или значения перечислений часто можно использовать вместо целочисленного типа или значения.

Размеры встроенных типов обсуждались в разделах 3.8, 17.3.1 и 25.5.1; указатели и массивы — в главах 17 и 18; ссылки — в разделах 8.5.4–8.5.6.

<p id="AutBody_Root601"><strong>A.8.1. Указатели</strong></p>

Указатель (pointer) — это адрес объекта или функции. Указатели хранятся в переменных указательных типов. Корректный указатель на объект содержит адрес этого объекта.

int x = 7;

int* pi = &x // указатель pi ссылается на объект x

int xx = *pi; // *pi — это значение объекта,

              // на который ссылается указатель pi, т.е. 7

Некорректный указатель — это указатель, не содержащий указателя ни на один объект.

int* pi2;         // неинициализированный

*pi2 = 7;         // неопределенное поведение

pi2 = 0;          // нулевой указатель (указатель pi2 остается некорректным)

*pi2 = 7;         // неопределенное поведение

pi2 = new int(7); // теперь указатель pi2 становится корректным

int xxx = *pi2;   // отлично: переменная xxx становится равной 7

Мы хотим, чтобы все некорректные указатели были нулевыми (0), поэтому можем провести проверку.

if (p2 == 0) { // "если указатель некорректный"

               // не используйте значение *p2

}

Или еще проще:

if (p2) { // "если указатель корректный"

          // используйте значение *p2

}

Перейти на страницу:

Похожие книги

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT