В отличие от Java или C #, где память, выделенная для вновь созданных объектов, ВСЕГДА установлена на ноль, это НЕ происходит в C ++. Существует несколько правил, которые описывают, когда инициализация объекта гарантированно происходит, а когда - нет.
Рассмотрим следующий пример:
class Base
{
private:
int i;
char ch;
std::string str;
public:
Base()
: i(0) //built-in fields remains unitialized. We should initialize it manually
, ch('\0') //another built-in field
//, str() //this call is redundant due automatic default constructors calls for all user-defined types
{}
void showdata()
{
cout<<"Int:"<<i<<endl; //valid only after manual initialization
cout<<"Char:"<<ch<<endl; //valid only after manual initialization
cout<<"String:"<<str<<endl; //always valid
}
//int pub_data ;
} ;
Вы должны помнить, что ВСЕ встроенные поля нужно инициализировать вручную в конструкторе классов.
P.S. То, что в первом случае ваш код работает, - чистая случайность.