В программировании инициализация или инициализация — это присвоение начального значения объекту данных или переменной. Способ выполнения инициализации зависит от языка программирования , а также типа , класса хранения и т. д. объекта, который должен быть инициализирован. Программные конструкции, которые выполняют инициализацию, обычно называются инициализаторами и списками инициализаторов . Инициализация отличается от (и предшествует) декларации , хотя на практике эти два понятия иногда можно объединить. Дополнением к инициализации является финализация , которая в основном используется для объектов, но не для переменных.
Инициализация выполняется либо статическим встраиванием значения во время компиляции, либо назначением во время выполнения . Раздел кода, который выполняет такую инициализацию, обычно называется «кодом инициализации» и может включать другие одноразовые функции, такие как открытие файлов; в объектно-ориентированном программировании код инициализации может быть частью конструктора (метода класса) или инициализатора (метода экземпляра). Установка ячейки памяти в шестнадцатеричные нули также иногда называется «очисткой» и часто выполняется исключительной инструкцией или (оба операнда указывают одну и ту же переменную) на уровне машинного кода , поскольку для этого не требуется дополнительного доступа к памяти.
В C/C99/C++ инициализатор является необязательной частью декларатора . Он состоит из символа '=', за которым следует выражение или список выражений, разделенных запятыми, заключенный в фигурные скобки. Последний список иногда называют "списком инициализатора" или "списком инициализации" (хотя термин "список инициализации" формально зарезервирован для инициализации членов класса/структуры в C++; см. ниже). Декларация, которая создает объект данных, а не просто описывает его существование, обычно называется определением .
Многие считают удобным провести различие между терминами «декларация» и «определение», как в общеизвестной фразе «различие между декларацией и определением ...», подразумевающей, что декларация просто обозначает объект данных (или функцию). Фактически, согласно стандарту C++ , определение является декларацией. Тем не менее, использование «декларации и определения», хотя формально и неверно, является распространенным. [1] Хотя все определения являются декларациями, не все декларации являются определениями.
Примеры на языке С:
int i = 0 ; int k [ 4 ] = { 0 , 1 }; char tx [ 3 ] = 'a' ; char ty [ 2 ] = 'f' ; struct Point { int x ; int y ;} p = { . y = 13 , . x = 7 };
Примеры на С++:
int i2 ( 0 ); int j [ 2 ] = { rand (), k [ 0 ]}; MyClass * xox = new MyClass ( 0 , "zaza" ); точка q = { 0 , i + 1 };
В C++ конструктор класса/структуры может иметь список инициализаторов внутри определения, но до тела конструктора. Важно отметить, что при использовании списка инициализации значения не присваиваются переменной. Они инициализируются. В приведенном ниже примере 0 инициализируется в re и im. Пример:
структура IntComplex { IntComplex () : re ( 0 ), im ( 0 ) {} int re ; int im ; };
Здесь конструкция : re(0), im(0)
представляет собой список инициализаторов.
Иногда термин «список инициализаторов» также используется для обозначения списка выражений в массиве или инициализаторе структуры.
C++11 предоставляет более мощную концепцию списков инициализаторов с помощью шаблона, называемого std::initializer_list .
Инициализация данных может происходить без явного синтаксиса в программе для этого. Например, если статические переменные объявлены без инициализатора, то переменные примитивных типов данных инициализируются значением нуля соответствующего типа, в то время как статические объекты типа класса инициализируются своими конструкторами по умолчанию .