Объявленная переменная может быть Инициализировано нулем , Инициализировано значение или Инициализировано по умолчанию .
Стандарт C ++ 03 8.5 / 5удачно определяет каждый:
К инициализация нулями объект типа T означает:
- если T - скалярный тип (3.9),объекту присваивается значение 0 (ноль), преобразованное в T;
- если T является типом класса, не являющимся объединением, каждый нестатический элемент данных и каждый подобъект базового класса
инициализируются нулями;
- если T является типом объединения, первый именованный элемент данных объекта инициализируется нулями;
- если T является типом массива, каждый элемент инициализируется нулями;
- если T является ссылочным типом, нетинициализация выполнена.
К инициализация по умолчанию объект типа T означает:
- если T является типом класса, отличным от POD (пункт 9), конструктор по умолчаниюдля T вызывается (и инициализация некорректна, если T не имеет доступного конструктора по умолчанию);
- если T является типом массива, каждый элемент инициализируется по умолчанию;
- в противном случае объект равен нулюинициализируется.
К значение-инициализация объект типа T означает:
- если T является типом класса (пункт 9) с объявленным пользователем конструктором (12.1), тогда вызывается конструктор по умолчанию для T (и инициализация некорректна, если у T нет доступного конструктора по умолчанию);
- если T является типом класса без объединения без конструктора, объявленного пользователем, то каждыйнестатический член данных и компонент базового класса T инициализируются значением;
- если T является типом массива, то каждый элемент инициализируется значением;
- в противном случае объект инициализируется нулем
Например:
#include<iostream>
using namespace std;
static int a; //Zero Initialized
int b; //Zero Initialized
int main()
{
int i; //Undefined Behavior, Might be Initialized to anything
static int j; //Zero Initialized
cout<<"\nLocal Uninitialized int variable [i]"<<i<<"\n";
cout<<"\nLocal Uninitialized Static int variable [j]"<<j<<"\n";
cout<<"\nGlobal Uninitialized Static int variable [a]"<<a<<"\n";
cout<<"\nGlobal Uninitialized int variable [b]"<<b<<"\n";
return 0;
}
Вы заметите, что результаты для переменной i
будут отличаться на разных компиляторах.Такие локальные неинициализированные переменные НЕ ДОЛЖНЫ использоваться .Фактически, если вы включите строгие предупреждения компилятора, компилятор сообщит об ошибке об этом.Вот как кодпад сообщает об ошибке.
cc1plus: warnings being treated as errors
In function 'int main()':
Line 11: warning: 'i' is used uninitialized in this function
Редактировать: Как справедливо отмечено @Kirill V. Lyadvinsky в комментариях, СЛЕДУЕТ НИКОГДА - довольно очень сильное слово, и тамможет быть совершенно допустимым кодом, который может использовать неинициализированные переменные, как он указывает на пример в своем комментарии.Поэтому я, наверное, должен сказать:
Никогда не следует использовать неинициализированные переменные, если вы точно не знаете, что делаете.