C ++ Список инициализации и выделение памяти - PullRequest
4 голосов
/ 08 октября 2009

Действительно ли следующее?

class myClass
{
   private:
     ...
     int m_nDataLength;
     boost::shared_array<int> m_pData;
     ...

   public:
     myClass(): ..., m_nDataLength(10), m_pData(new int[m_nDataLength]), ...
     {
     }
}

Прав ли я, предполагая, что инициализация произойдет именно в том порядке, который я дал в ctor? Если нет, что если инициализация m_nDataLength произойдет после m_pData?

Ответы [ 3 ]

10 голосов
/ 08 октября 2009

Хотя инициализация в вашем примере происходит в том порядке, в котором вы хотите, это не по той причине, по которой вы предполагаете: Инициализация происходит в порядке элементов данных объявление в определении класса. Причина этого в том, что деструктор должен уничтожать элементы в обратном порядке, независимо от того, какой конструктор использовался для создания объекта. Для этого должен использоваться независимый от конструктора способ определения порядка построения.

Это означает, что если вместо

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!
9 голосов
/ 08 октября 2009

инициализация инициализирует поля по порядку в классе, поэтому: если вы измените

private:
  ...
  int m_nDataLength;
  boost::shared_array<int> m_pData;

в

private:
  ...
  boost::shared_array<int> m_pData;
  int m_nDataLength;

это не сработает. В конструкторе порядок не применяется.

5 голосов
/ 08 октября 2009

Нет, инициализация для членов класса происходит в том порядке, в котором члены появляются в определении класса. Если элемент появляется в списке инициализаторов, то он управляет выражением, используемым для инициализации этого элемента (даже если он использует элемент, который еще не был инициализирован), но место его появления в списке инициализаторов не влияет на его инициализацию. 1001 *

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