Инициализация переменных и конструкторы - PullRequest
2 голосов
/ 11 июня 2009

В настоящее время я прохожу курс с ++ и пытаюсь глубоко понять все это. Я выдвинул некоторые теории, было бы замечательно, если бы кто-то мог подтвердить их:

Гарантируется, что каждая переменная (локальная, глобальная, staic, member и non-member) будет вызывать свой ctor перед первым использованием

Которы примитивов, таких как int, по существу не используются, поэтому мы явно присваиваем значение, нулевое значение по умолчанию отсутствует.

следующие классы семантически одинаковы (и должны генерировать идентичный код)

class A 
{ 
  int n; 
};

и

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

и

class A 
{
  int n;
 public:
  A() { n = int(); }
};

Переменная n в каждом случае все еще неинициализирована.

EDIT:

Кажется, я совершенно недооценил сложность этого предмета, большинство моих предположений были неверными. Сейчас я все еще пытаюсь выяснить основные правила инициализации объекта.

Ответы [ 4 ]

4 голосов
/ 11 июня 2009

Боюсь, вы не правы. Когда вы говорите:

int n = int();

Тогда n (и все другие типы POD) будут инициализированы нулями.

Кроме того, убедитесь, что вы очень четко представляете себе разницу между инициализацией и назначением - это очень важно в C ++:

int n = int();    // initialisation
n = 0;            // assignment
3 голосов
/ 11 июня 2009

Вы можете найти это интересным.

Разница между новым Foo и новым Foo (), что бывший будет неинициализированный и последний будет по умолчанию инициализируется (в ноль), когда Foo это тип POD. Таким образом, когда не используется форма с паренсом, член "а" может содержать мусор, но с Паренс «а» всегда будет инициализирован до 0.

1 голос
/ 11 июня 2009
class A 
{ 
   int n; 
};

Выделена только память, для n.

инициализация не производится.
class A 
{
  int n;
 public:
  A() : n() {}
};

Здесь n инициализируется с 0.


class A 
{
  int n;
 public:
  A() { n = int(); }
};

Здесь n сначала создается (без какого-либо значения по умолчанию), затем int() вызывает создание temp int со значением 0 Который затем присваивается n;

1 голос
/ 11 июня 2009

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

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

Встроенные типы (и структуры «старых данных») могут оставаться неинициализированными, как в первом примере. Хотя они не имеют пользовательских конструкторов, использование синтаксиса конструкции (два других ваших примера) инициализирует их в ноль.

Причина этого слегка хитрого правила состоит в том, чтобы избежать чрезмерных накладных расходов; например, если вы определили:

struct S
{
   int array[1024*1024];
};

с намерением присваивать значения только так, как вам нужно, вы не захотите, чтобы компилятор отбеливал 4 Мб памяти нулями при каждом ее создании.

...