при статической или динамической инициализации - PullRequest
2 голосов
/ 18 февраля 2012

Инициализация с использованием конструктора по умолчанию (генерируется компилятором) «статическая инициализация» или «динамическая инициализация»?

Я имею в виду, что в

class test{
  int m;

public :
  test(): m(12) {}

};

test i;

int main()
{//
}

Здесь, когда i инициализируется - во время компиляции или это динамическая инициализация, т. Е. Безопасно ли использовать i в других файлах для инициализации или других вещей?
Что если пользователь определил конструктор по умолчанию?

1 Ответ

2 голосов
/ 18 февраля 2012

Поскольку test имеет конструктор, он будет запущен при инициализации объекта. Объект будет помещен в область памяти, которая инициализируется нулем. Вы даже можете проверить это, инициализируя значения с помощью i.m до и после создания объекта:

extern test i;
int dummy1 = i.m;
test i;
int dummy2 = i.m;

Когда вы печатаете dummy1 и dummy2, вы должны получить 0 и 12 соответственно. Если вы хотите статически инициализировать i, вам нужно использовать что-то вроде

test i = { 12 };

Однако это работает только с POD. Все, что сказал, обратите внимание, что глобальные данные всегда плохо. Просто не беспокойтесь и делайте все правильно.

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