Инициализация статических полей класса. Ч1



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



Начнем с того, что все статические поля всех классов инициализируются до входа в main. Это и логично, ведь к таким полям мы в любой момент можем обратиться без объекта, просто по имени класса. Но вот в какой конкретно момент времени мы не можем сказать наверняка, это implementation defined штука. Каждый линкер вправе делать это по-своему. Единственное, что стандарт нам гарантирует:



Objects with static storage duration 

defined in namespace scope in the same

translation unit and dynamically initialized

shall be initialized in the order in which

their definition appears in the translation unit.





Все статические объекты инициализируются в порядке, в котором они определены(не объявлены) в единице трансляции. Причем происхождение этого статического объекта не важно. Например, скомпилировав и запустив такой пример в main.cpp:



struct Helper {

Helper(int num) : data{num} {

std::cout << "Helper " << num << std::endl;

}

private:

int data;

};



struct Class {

static Helper a;

static Helper b;

};



Helper Class::b{1};

static Helper c{2};

Helper Class::a{3};



int main() {}





Мы в выводе получим следующее:



Helper 1

Helper 2

Helper 3





Несмотря на то, что в классе Class поле a было объявлено первым, инициализируется оно самым последним, потому что оно определено самым последним. А переменная c вообще не относится к классу, но была проинициализирована между полями Class'а, потому что ее определение расположено между ними.



Это происходит из-за того, что статические поля класса практически никак с этим классом не связаны. Доступ к ним разве что через имя класса. А так это обычная статическая переменная, как и любая другая.



Именно поэтому в цитате из стандарта говорится обобщенно о статических объектах. Для линкера вообще никакой разницы между переменными a, b и c нету. Это просто сущности с разными именами, но абсолютно равными правами.



С инициализацией статических полей и объектов еще много нюансов, будем потихоньку все разбирать.



Define order of your life. Stay cool.



#cppcore