Хотя инициализация в вашем примере происходит в том порядке, в котором вы хотите, это не по той причине, по которой вы предполагаете: Инициализация происходит в порядке элементов данных объявление в определении класса. Причина этого в том, что деструктор должен уничтожать элементы в обратном порядке, независимо от того, какой конструктор использовался для создания объекта. Для этого должен использоваться независимый от конструктора способ определения порядка построения.
Это означает, что если вместо
class myClass
{
private:
...
int m_nDataLength;
boost::shared_array<int> m_pData;
кто-то изменит ваш код на
class myClass
{
private:
...
boost::shared_array<int> m_pData;
int m_nDataLength;
тогда в коде будет ошибка.
Мой совет:
- Напишите ваши конструкторы, чтобы порядок инициализации не имел значения.
- Если вы не можете сделать это (примечание: для меня это происходило менее 5 раз за последнее десятилетие), проясните это полностью в момент объявления членов данных.
Примерно так должно поступить:
class myClass
{
private:
...
int m_nDataLength; // Note: Declaration order
boost::shared_array<int> m_pData; // matters here!