Считайте книжные Глюки C++: Предотвращение Типичных проблем в Кодировании и Дизайне .
Как было сказано ранее, инициализация статического поля является детерминированной и происходит в соответствии с порядком объявления текста.
Take это, например:
class Foo
{
public static string b = a + "def";
public static string a = "abc";
}
Foo.b всегда будет возвращать "def".
В этом отношении, когда существует зависимость между статическими полями, лучше использовать статический инициализатор:
class Foo
{
public static string b;
public static string a;
static Foo()
{
a = "abc";
b = a + "def";
}
}
Таким образом, вы явно выражаете беспокойство по поводу порядка инициализации; или зависимости в этом отношении (даже если компилятор не поможет, если вы случайно поменяете местами операторы инициализации.) Вышеупомянутые ожидаемые значения будут сохранены в a и b (соответственно «abc» и «abcdef»).
Однако , все может стать запутанным (и зависящим от реализации) для инициализации статических полей, определенных в нескольких классах.
Он всегда будет отображать «abcdef», потому что инициализация идет сверху вниз в исходном коде, как и раньше.
Все статические члены будут инициализированы при загрузке содержащего их classtype. ]