Помимо других случаев, он работает в следующих случаях:
MyClass a[10];
MyClass* b = new MyClass[10];
Будьте осторожны, если вы используете контейнеры STL для хранения MyClass
объектов. Возможно, он не ведет себя так, как вы ожидали, и проблему трудно найти. См. Следующий пример:
int MyClass::currentID = 0;
...
std::vector<MyClass> c(10);
MyClass a;
В этом случае результат будет следующим:
c[0].myID = 0;
c[1].myID = 0;
....
c[9].myID = 0
=============
a.myID = 1.
Конструктор по умолчанию выполняется только ОДИН раз. Причина в том, что конструктор std :: vector будет использовать одно и то же значение для инициализации всех элементов вектора. В моей системе конструктор std :: vector имеет следующий вид:
explicit
vector(size_type __n, const value_type& __value = value_type(),
const allocator_type& __a = allocator_type())
: _Base(__n, __a)
{ _M_fill_initialize(__n, __value); }
_M_fill_initialize
инициализирует выделенную память, используя __value
(что происходит из конструктора по умолчанию value_type()
) __n
раз.
Приведенный выше код в конечном итоге вызовет uninitialized_fill_n
, что делает следующее:
for (; __n > 0; --__n, ++__cur)
std::_Construct(&*__cur, __x);
Вот std::_Contruct
:
template<typename _T1, typename _T2>
inline void
_Construct(_T1* __p, const _T2& __value)
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 402. wrong new expression in [some_]allocator::construct
::new(static_cast<void*>(__p)) _T1(__value);
}
Здесь вы видите, что он наконец вызывает глобальный оператор new
, чтобы инициализировать каждый элемент в векторе, используя то же значение .
Вывод таков: использование статического элемента в качестве исходного элемента данных будет работать в большинстве случаев, но может не сработать, если вы планируете использовать его в контейнерах STL, и эту проблему трудно найти. Я только попробовал std::vector
, вполне возможно, что проблема существует при использовании других типов stl-контейнеров с MyClass
объектами.