Страницы

Поиск по вопросам

вторник, 23 апреля 2019 г.

В чём разница между определением, объявлением, реализацией и инициализацией?

В чём разница между определением, объявлением, реализацией и инициализацией?


Ответ

Если совсем кратко:
typedef int MyType; // объявление синонима типа
extern int value; // объявление переменной int value; // объявление + определение посредством неявной инициализации int value2 = 0; // объявление + определение посредством явной инициализации значением 0
int func(); // объявление функции (прототип функции) int func(){ return 0; } // определение функции посредством реализации
class SomeClass; // объявление класса class SomeClass // определение класса { static int field; }; // объявление static члена класса int SomeClass::field = 0; // определение static члена класса посредством инициализации значением 0

Явная и неявная инициализация переменных
Если при определении переменной не происходит явного присвоения ей какого-либо значения (т.е. не происходит явной инициализации), то компилятор может проинициализировать её сам в соответствии со следующими правилами:
переменные со статическим временем существования (глобальные, в пространствах имен и статические) инициализируются нулем автоматические переменные не инициализируются (т.е. имеют случайное значение той области стека, которую компилятор выделил под переменную) динаммические переменные не инициализируются (т.е. имеют случайное значение той области памяти, которая была выделена под объект в куче)
Стоит заметить, что в большинстве реализаций в debug-версии под автоматические переменные область стека заполняется значениями 0xCCCCCCCC, а область heap (кучи) заполняется 0xCDCDCDCD, что может позволить при отладке выявлять использование неинициализированных переменных.

Объявление и определение
Стоит заметить, что объявлений может быть сколь угодно много, а определение лишь одно (за исключением inline функций, которые при этом не нарушают ODR).

Комментариев нет:

Отправить комментарий