Объявления и определения
Еще немного очень важной терминологии: *
Объявление
(declaration)
объявляет о существовании имени (идентификатора) и его типа или атрибутов.
*
Определение
(definition) -
объявление, которое дополнительно обеспечивает
конкретную реализацию для данного идентификатора, заключающуюся в
выделении памяти для объекта, соответствующей идентификатору, и возможно,
инициализации этой памяти.
Объявлений может быть много. Главное, чтобы они не противоречили
друг другу. В пределах одной единицы трансляции допустимо только одно
определение (One Definition Rule или ODR).
Примеры объявлений (из стандарта):
extern int a; //
объявление 'a'. Ключевое слово extern говорит о
//
том, что определение дано в другом месте
extern const int c
;// объявление 'c'. Значение константы не указано.
//
Константа не инициализирована благодаря 'extern'.
int f(int);
// объявление 'f'. Объявление функции. Тело функции,
//
ее реализация, отсутствует.
class S
; // объявление 'S'. Объявление класса "S". Содержание
//
класса отсутствует.
typedef int Int
; // объявление 'Int'. Объявление синонима типа.
using N::d
; // объявление некого 'd' из пространства имен 'N'.
14
Объявления только создают новое имя, но не сопостовляют его с
конкретной реализацией. В отличие от объявления, определение создает
соответствие имени и его воплощения. Примеры взяты также из стандарта:
int a;
// определение 'a' типа int
extern const int c
= 1; // определение константы 'c' с конкретным
//
занчением '1' и типом int
int f(int x) { return x+a
; } // определение функции 'f' и параметра 'x'
class S { int a; int b; };
// определение класса 'S' и его
//
членов 'S::a' и 'S::b'
class X {
// определение 'X'
int x;
// определение члена 'x'
static int y;
// обявление статического члена 'y'. Для того
//
чтобы оно стало определением статический
//
член должен быть проинициализирован.
//
Инициализация статических членов делается
//
вне класса. О статических членах будет
//
отдельный рассказ.
X(): x
(0) { } // определение конструктора 'X'. Что такое
//
конструктор узнаете позже.
};
int X::y
= 1; // определение статического члена кдасса 'X::y'
enum { up, down
}; // определение энумераторов перечисления 'up'
//
и 'down' (о перечислениях также
//
будет рассказ ниже)
namespace N { int d; }
// определение пространства имен 'N' и объекта
//
в нем 'N::d'
namespace N1 = N
; // определение пространства имен 'N1' как
//
синонима 'N'. Такая конструкция согласно
//
стандарту считается определением потому что
//
новое имя N1 благодаря ей имеет вполне
//
законченный смысл.
X anX;
// определение объекта 'anX' класса 'X'
Язык C++ изначально обладает набором
фундаментальных типов
данных
, иначе именуемых встроенными типами, и не требующих определения
пользователем (программистом, который их использует). Определение
объектов фундаментальныхъ типов, часто называемых переменными,
происходит указанием имени объекта после указания типа. Пример:
int x;
15
Do'stlaringiz bilan baham: |