Т.е., если я в классе объявлю поле типа int, и в контрукторе не проинициализирую его, и не сделаю присвоения, то его значение ГАРАНТИРОВАННО будет равно нулю?Airhand писал(а):Для int-а - это 0.
Свежо предание, да верится с трудом (c)
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Т.е., если я в классе объявлю поле типа int, и в контрукторе не проинициализирую его, и не сделаю присвоения, то его значение ГАРАНТИРОВАННО будет равно нулю?Airhand писал(а):Для int-а - это 0.
Да, так по крайней мере написано в 3 стандарте. Если компилятор полностью поддерживает стандарт анси, то инты проинитятся в ноль где-то в конструкторе.BBB писал(а):Т.е., если я в классе объявлю поле типа int, и в контрукторе не проинициализирую его, и не сделаю присвоения, то его значение ГАРАНТИРОВАННО будет равно нулю?
Свежо предание, да верится с трудом (c)
Airhand писал(а):Да, так по крайней мере написано в 3 стандарте. Если компилятор полностью поддерживает стандарт анси, то инты проинитятся в ноль где-то в конструкторе.
Проверил на MinGW:Romeo писал(а):Стандарт гарантирует, что вся статическая память (в которой располагаются глобальные и статические переменные) будет проинициализирована нулями ещё до входа в main. Таким образом, если, к примеру, объект нашего класса будет создан глобально, то в его int мембере действительно будет 0. Но не потому, Airhand , что был вызван конструктор по умолчанию для этой int переменой, а потому, что переменная попадает в обнулённую ранее память. В случае, если наш объект создадут на стеке или в динамической памяти - там будет мусор и только мусор, можешь проверить.
Код: Выделить всё
#include <iostream>
using namespace std; // for cout, cerr
class tWithInt {
private :
int m_int;
public :
tWithInt (void) {};
int Get_m_int (void) { return m_int; };
};
tWithInt glo_WithInt;
int main (int argc, char** argv)
{
tWithInt oWithInt;
tWithInt * pWithInt;
//----------------------------------
cout << "glo_WithInt.m_int: " << glo_WithInt.Get_m_int () << endl;
cout << "oWithInt.m_int: " << oWithInt.Get_m_int () << endl;
pWithInt = new tWithInt ();
cout << "pWithInt->m_int: " << pWithInt->Get_m_int () << endl;
delete pWithInt;
return (0);
}; // main
Стандарт даёт гарантию только о том, что должна быть занулена статическая область памяти. Всё остальное на усмотрение компилятора. Часто компиляторы оптимизируют работу программы не зануюляя остальные типы памяти." писал(а):. Для хипа почему-то (к моему удивлению) тоже 0.
А что MinGW полностью поддерживает 3 стандарт ? Может там просто не происходит вызова конструктора. Попробуй на вижуале.BBB писал(а):Проверил на MinGW:Код: Выделить всё
#include <iostream> using namespace std; // for cout, cerr class tWithInt { private : int m_int; public : tWithInt (void) {}; int Get_m_int (void) { return m_int; }; }; tWithInt glo_WithInt; int main (int argc, char** argv) { tWithInt oWithInt; tWithInt * pWithInt; //---------------------------------- cout << "glo_WithInt.m_int: " << glo_WithInt.Get_m_int () << endl; cout << "oWithInt.m_int: " << oWithInt.Get_m_int () << endl; pWithInt = new tWithInt (); cout << "pWithInt->m_int: " << pWithInt->Get_m_int () << endl; delete pWithInt; return (0); }; // main
Результат:
glo_WithInt.m_int: 0
oWithInt.m_int: 2147332096
pWithInt->m_int: 0
Т.е. В ОБЩЕМ СЛУЧАЕ зануления поля класса типа int не происходит (т.е. Airhand не прав).
Для глобалного экземпляра гласса, действительно, получилось 0. Для хипа почему-то (к моему удивлению) тоже 0.
Не происходит вызова конструктора ЧЕГО?Airhand писал(а): Может там просто не происходит вызова конструктора. Попробуй на вижуале.
Класса конечно, ведь в нём происходит инициализация членов.BBB писал(а):Не происходит вызова конструктора ЧЕГО?