Член поля, порядок строительства - PullRequest
7 голосов
/ 10 июня 2011

В C ++, когда вы делаете что-то вроде того, что вы видите ниже, гарантируется ли порядок построения?

Logger::Logger()
    : kFilePath_("../logs/runtime.log"), logFile_(kFilePath_)
{
    // ...
}

Ответы [ 2 ]

28 голосов
/ 10 июня 2011

Да, порядок строительства всегда гарантирован. Однако не гарантируется, что он будет таким же, как порядок, в котором объекты появляются в списке инициализатора.

Переменные-члены создаются в том порядке, в котором они объявлены в теле класса. Например:

struct A { };
struct B { };

struct S {
    A a;
    B b;

    S() : b(), a() { }
};
Сначала строится

a, затем b. Порядок, в котором переменные-члены появляются в списке инициализатора, не имеет значения.

9 голосов
/ 10 июня 2011

Порядок построения - это порядок объявления в определении класса.

Если порядок в ctor-initializer отличается, это не влияет на порядок построения.Ваш компилятор может предупредить об этом.

См. 12.6.2 / 5 (редакция 2003 года с именем [class.base.init]):

элементы нестатических данных должны быть инициализированы в порядке, в котором они были объявлены.в определении класса (опять же независимо от порядка инициализации mem).

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