компилятор сгенерировал конструктор по умолчанию в C ++ - PullRequest
1 голос
/ 07 августа 2010

объявление структуры Table:

struct Tables {
       int i;
       int vi[10];
       Table t1;
       Table vt[10];
};

Tables tt;

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

здесь tt.t1 будет инициализирован с использованием стандартного конструктора для таблицы, а также каждого элемента в tt.vt.

С другой стороны, tt.i и tt.vi не инициализируются, потому что эти объекты не относятся к типу класса.

поэтому мы остаемся с полуинициализированным объектом tt.

если я правильно понял - если tt.i или tt.vi не будут явно инициализированы в коде, после создания tt будет выдано сообщение об ошибке, если мы попытаемся прочитать из них значение?

2) Может кто-нибудь объяснить мне, почему разработчики cpp не хотят просто инициализировать встроенные типы int и int [] равными нулю?

Ответы [ 3 ]

4 голосов
/ 07 августа 2010

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

Обратите внимание, что сам язык C ++ генерирует исключения только очень, очень редко - о тех случаях, когда я могу думать о том, что он делает, при выполнении неверного приведения к ссылке через dynamic_cast, и когда new не удается выделить. Конечно, в стандартной библиотеке может быть несколько ошибок.

Что касается того, почему C ++ работает таким образом (и C тоже), то инициализация скважины требует времени, а если она не нужна, то это трата времени. Например, если вы собирались сразу прочитать пользовательский ввод в эти переменные, нет смысла инициализировать их, прежде чем вы это сделаете.

3 голосов
/ 07 августа 2010

Ошибка не выдается, это не Java.:)

Будет возвращено то, что будет в памяти в это время.У вас есть неинициализированная переменная.Это может быть 0. Это может быть 42. Это будет что-то непредсказуемое каждый раз.

Мораль истории - инициализируйте ВСЕ ваши переменные.Невыполнение этого требования может привести к невероятно трудным ошибкам в будущем.

Поскольку это C ++, используйте конструктор по умолчанию для инициализации вашей структуры:

struct Tables { 
       int i; 
       int vi[10]; 
       Table t1; 
       Table vt[10]; 

Tables() {
  i = 0;
  for (int iter = 0; iter < 10; iter++)
    vi[iter] = 0;
}

}; 

Tables tt; 
1 голос
/ 07 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...