В C++ есть две формы инициализации переменных. Явная и неявная.
При явной форме в инициализации участвует инициализатор '=':
int a = 5, b = 6, c = a*b;
extern int d;
string temp = "temp message";
При неявной форме (задается при декларировании переменной):
int a(5), b(6), c(a*b);
extern int d();
string temp("temp message");
У встроенных типов данных имеется специальный синтаксис для задания нулевого значения:
int ival = int();
double dval = double();
Если объект определен как глобальный, спецификация C++ гарантирует, что он будет инициализирован нулевым значением, если же переменная локальная либо динамически размещаемая (с помощью оператора new), ее начальное значение не определено, то есть она может содержать некоторое случайное значение. Что может приводить к различного уровня ошибкам.