2014-11-03 4 views
0

Моего кода, как показано ниже: (Пробовал сделали мой исходный код здесь проще)значения по умолчанию для члена класса в C++

class ExClass { 

public: 
    int check; 
    ExClass() { } 
} 

//in main 
int main() 
{ 
    ExClass *classPtr = new ExClass(); 
    if(classPtr->check == -1) 
    { 
    cout<<"check is negative"; 
    } 
} 

Здесь переменная «проверить» не инициализируется в конструкторе, поэтому он должен принять некоторая стоимость мусора (как я знаю).

Но моя проблема здесь в том, что всегда печать «проверка отрицательна». (Так что «проверить» -1)

Как это происходит каждый раз? Как переменная 'check' равна -1 всегда?

Спасибо за помощь!

+2

'ExClass(): check (0) {}' –

+1

Я действительно не думаю, что вы можете полагаться на 'check' всегда на' -1'. Похож на ошибку, ожидающую своего появления. Просто подумайте, что, скорее всего, значения инициализации для переменных являются компиляторами ** и ** зависимыми от платформы. – JoErNanO

+0

Я думаю, что значение зависит от вашего компилятора. Здесь я использую MinGW-w64 complier, и это случайное число. –

ответ

2

ваш check является то, что называется uninitialized variable:

Обычным предположение, сделанное начинающих программистов в том, что все переменные устанавливаются в известное значение, например, ноль, когда они были объявлены. Хотя это верно для многих языков, это неверно для всех из них, и поэтому существует вероятность ошибки. Языки, такие как C, используют пространство стека для переменных, а набор переменных, назначенных для подпрограммы, называется фреймом стека. В то время как компьютер выделяет достаточное количество пространства для фрейма стека, он обычно делает это просто, корректируя значение указателя стека и не устанавливая память в какое-либо новое состояние (как правило, из соображений эффективности). Поэтому любое содержимое этой памяти в это время будет отображаться как начальные значения переменных, которые занимают эти адреса.

Это означает, что значение не является случайным. Но больше «того, что ценность вещи раньше было».

Также обратите внимание, что некоторые компиляторы (например, visual C++) инициализируют неинициализированную память с магическими номерами (In Visual Studio C++, what are the memory allocation representations?) в режиме отладки.

Смежные вопросы