Я пытаюсь узнать о работе конструктора по умолчанию класса и не могу понять эту ситуацию:
Случай 1:
class A
{
public:
int m;
string s;
};
Затем я создаю объект этого класса:
а) A a; // Result: compiler initializing m with garbage value
б) A a = A(); // Result : compiler initializing m with garbage value
Случай 2: теперь я удалил строку s
из моего класса:
class A
{
public:
int m;
};
а) A a; // Result: when try to access m I get run time error
б) A a = A(); //Result: m is initialized to zero
Q1) Почему существует расхождение в случае 1 и 2?
Q2) Что если я предоставлю конструктор по умолчанию для моего класса в обоих случаях, то а) & б) будет так же?
Случай 1: Класс A
это не POD.
Случай 2: класс A
это стручок
a) A a; //This is default initialization
b) A a = A(); // This is value initialization
Случай 1′: m
будет инициализирован до некоторого значения мусора конструктором по умолчанию, сгенерированным компилятором.
Дело «2»: m
будет инициализироваться нулем, потому что A
это стручок
Вы не должны получить сбой в любом из сценариев. Если вы делаете, вероятно, вы используете сломанный компилятор.
Для получения более подробной информации об инициализации по умолчанию и инициализации значения обратитесь к эта ссылка.
Потому что в обоих случаях целое число неинициализировано. Это означает, что его значение не определено. Это может быть ноль или любое другое значение, которое может содержать целое число.
Если вы хотите инициализировать его в ноль в конструкторе по умолчанию, вы можете сделать это так:
class A
{
public:
A::A();
int m;
};
A::A()
: m( 0 )
{}
Обратите внимание, что вам не нужно предоставлять явный конструктор для string
потому что это класс, и имеет свой собственный конструктор по умолчанию.
Единственная разница class A
между случаем 1 и 2 то, что в случае 1 компилятор будет нетривиальный конструктор по умолчанию так как s
в class A
это не примитивный тип.
Однако в обоих случаях m
не инициализируется.