• начальное значение объявляемой сущности (во многих случаях необязательное).
Мы можем объявлять следующие сущности:
• объекты встроенных типов и типов, определенных пользователем (раздел 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).
A.7.1. Определения
Определение с инициализацией, резервирующее область памяти или как-то иначе поставляющую компилятору всю информацию, необходимую для использования имени в программе, называется
double f; // объявление
double f { /* ... */ }; // также определение
extern const int x; // объявление
int y; // также определение
int z = 10; // определение с явной инициализацией
Константы должны быть инициализированы. Для этого используется инициализатор, если константа не объявлена с помощью ключевого слова extern (в таком случае инициализатор вместе с определением должны быть расположены в другом месте) или если константа не имеет тип, имеющий конструктор по умолчанию (раздел A.12.3). Константные члены класса должны инициализироваться в каждом конструкторе с помощью инициализатора (раздел A.12.3).
A.8. Встроенные типы
Язык 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 бит.
float
, double
и long double
. Они являются приближением действительных чисел в языке С++.
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.
A.8.1. Указатели
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
}