Во время инициализации в вашем примере действительно происходит в порядке, вы хотите, это не по той причине, вы берете на себя: Инициализация происходит в порядке элементов данных декларации в определении класса. Причина этого в том, что деструктор должен уничтожать элементы в обратном порядке, независимо от того, какой конструктор использовался для создания объекта. Для этого необходимо использовать конструктор-независимый способ определения порядка построения.
Это означает, что, если вместо
class myClass
{
private:
...
int m_nDataLength;
boost::shared_array<int> m_pData;
кто-то изменит свой код
class myClass
{
private:
...
boost::shared_array<int> m_pData;
int m_nDataLength;
тогда код будет иметь ошибку.
Мой совет:
- Напишите свои конструкторами, так что порядок initialiszation не имеет значения.
- Если вы не можете этого сделать (обратите внимание: для меня это произошло менее 5 раз за последнее десятилетие), сделайте это совершенно ясно в момент объявления членов данных.
Что-то вроде этого нужно сделать:
class myClass
{
private:
...
int m_nDataLength; // Note: Declaration order
boost::shared_array<int> m_pData; // matters here!
См http://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order. –
Я этого не заметил, мой вопрос кажется дублирующим. Спасибо, что уведомил Люка. – legends2k