Давайте разберемся.Предположим, где-то есть class Foo;
.Теперь мы делаем это статическим членом нашего класса,
class Star
{
static Foo z;
// ...
};
Теперь, по сути, он объявляет глобальный объект Foo Star::z
- так как же это создается?Стандарт говорит вам: он построен по умолчанию.Но помните, что вы должны предоставить фактический экземпляр объекта в одной из ваших единиц перевода:
// in, say, star.cpp
Foo Star::z; // OK, object lives here now
Теперь предположим, что Foo
на самом деле не имеет конструктора по умолчанию:
class Foo
{
public:
Foo(char, double); // the only constructor
// ...
};
Теперь возникает проблема: как нам построить Star::z
?Ответ «точно так же как и выше», но теперь мы должны вызвать конкретный конструктор:
// again in star.cpp
Foo Star::z('a', 1.5);
Стандарт фактически имеет два различных понятия «инициализация» (грамматическая концепция)и "конструкция" (вызов функции), но я не думаю, что нам нужно сейчас углубляться в это.