Главная->Інформатика та програмування->Содержание->Раздельное объявление и определение полей класса

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 6) онлайн

Раздельное объявление и определение полей класса

Определение статических полей класса происходит не так, как для обычных по- лей. Обычные поля объявляются (компилятору сообщается имя и тип поля) и определяются (компилятор выделяет память для хранения поля) при помощи одного оператора. Для статических полей эти два действия выполняются двумя разными операторами: объявление поля находится внутри определения класса, а определение поля, как правило, располагается вне класса и зачастую представ- ляет собой определение глобальной переменной.

Для чего используется такая двойственная форма? Если бы определение стати- ческого поля класса находилось внутри класса (как и предполагалось в ранних версиях C++), то это нарушило бы принцип, в соответствии с которым определе- ние класса не должно быть связано с выделением памяти. Поместив определение статического поля вне класса, мы обеспечили однократное выделение памяти под это поле до того, как программа будет запущена на выполнение и статиче-

ское поле в этом случае станет доступным всему классу. Каждый объект класса уже не будет обладать своим собственным экземпляром поля, как это должно быть с полями автоматического типа. В этом отношении можно усмотреть ана- логию статического поля класса с глобальными переменными.

Object1               Object2               Object3

Работая со статическими данными класса, легко совершить ошибки, которые компилятор будет не в силах распознать. Если вы объявите статическое поле класса, но забудете его определить, компилятор не выдаст предупреждающего сообщения. Ваша программа будет считаться корректной до тех пор, пока ре- дактор связей не обнаружит ошибку и не выдаст сообщение о том, что вы пы- таетесь обратиться к необъявленной глобальной переменной. Это произойдет в том случае, если вы забудете указать имя класса при объявлении, например foo:: в программе STATDATA.

 

25