2014-02-01 3 views
0

Может кто-нибудь объяснить мне этот код?Нужна помощь по пониманию одноэлементного шаблона

class S 
{ 
    public: 
     static S& getInstance() 
     { 
      static S instance; 
      return instance; 
     } 
    private: 
     S() {} 
     S(S const&);    // Don't Implement. 
     void operator=(S const&); // Don't implement 
}; 

То, что я понял это: деЫпзЬапсе статический метод, который возвращает ссылку на экземпляр, но где создается этот экземпляр? Я не вижу новых S(); так что ...

+5

Он создается прямо здесь: 'static S instance;' - вам не нужно 'new' для создания объекта. –

+0

статическая переменная в функции, созданной при первом вызове и существовавшей до окончания программы; – alexolut

+0

Будет ли это создавать новый экземпляр каждый раз, когда я вызываю getInstance? Я не понимаю –

ответ

1

Объект с объемной областью со статическим временем хранения (в вашем случае static S instance;) инициализируется, когда первый элемент управления проходит через его объявление. До C++ 11 это не является потокобезопасным (однако некоторые компиляторы предлагают варианты для обеспечения безопасности потоков). Что касается C++ 11, в стандарте указано, что «Если элемент управления входит в объявление одновременно при инициализации переменной, одновременное выполнение должно ждать завершения инициализации».

+0

"инициализируется, когда первый элемент управления передает свою инициализацию" - если он имеет явную инициализацию. Тем не менее, он всегда инициализируется нулем перед каждым другим инициализацией. –

+0

@ H2CO3 Спасибо за комментарий. Да, сначала начинается нулевая инициализация. – neverhoodboy

+0

@ H2CO3 'instance' будет« инициализирован по умолчанию »(вызов конструктора по умолчанию), первый элемент управления проходит через его объявление. Что вы подразумеваете под «если он имеет явную инициализацию»? – neverhoodboy

Смежные вопросы