Сгенерированный компилятором конструктор по умолчанию работает

Я пытаюсь узнать о работе конструктора по умолчанию класса и не могу понять эту ситуацию:

Случай 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) Что если я предоставлю конструктор по умолчанию для моего класса в обоих случаях, то а) & б) будет так же?

4

Решение

Случай 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 это стручок

Вы не должны получить сбой в любом из сценариев. Если вы делаете, вероятно, вы используете сломанный компилятор.

Для получения более подробной информации об инициализации по умолчанию и инициализации значения обратитесь к эта ссылка.

2

Другие решения

Потому что в обоих случаях целое число неинициализировано. Это означает, что его значение не определено. Это может быть ноль или любое другое значение, которое может содержать целое число.

Если вы хотите инициализировать его в ноль в конструкторе по умолчанию, вы можете сделать это так:

class A
{
public:
A::A();
int m;
};

A::A()
: m( 0 )
{}

Обратите внимание, что вам не нужно предоставлять явный конструктор для string потому что это класс, и имеет свой собственный конструктор по умолчанию.

3

Единственная разница class A между случаем 1 и 2 то, что в случае 1 компилятор будет нетривиальный конструктор по умолчанию так как s в class A это не примитивный тип.
Однако в обоих случаях m не инициализируется.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector