КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лекция №5 Данные-элементы, статические данные, константные данные
Каждый объект класса имеет свою собственную копию всех данных-элементов класса. Но в определенных случаях во всех объектах класса должна фигурировать только одна копия некоторых данных. Например, это может быть счетчик числа созданных объектов класса (например счетчик окон в многооконном приложении). Единственную копию данных необходимо иметь, например, если в классе имеются некоторые константы, одинаковые для всех объектов класса. В этом случае нерационально хранить в каждом объекте собственные копии этих констант. Рациональнее иметь единственные экземпляры этих констант для всех объектов (например значения физических констант). Для введения в класс подобных данных используются статические данные, которые содержат информацию «для всего класса». Объявление статических элементов в классе начинается с ключевого слова static. Например: static int D; Статические элементы могут быть открытыми, закрытыми или защищенными. Доступ к открытым статическим элементам класса возможен посредством любого объекта класса или посредством имени класса с помощью бинарной операции разрешения области действия. Например: MyClass::D = 10; Закрытые и защищенные статические элементы класса должны быть доступны открытым функциям-элементам этого класса или дружественным функциям и классам. Статические элементы класса существуют даже тогда, когда не существует никаких объектов этого класса (!). В этом случае доступ к открытому статическому элементу обеспечивается так же с помощью имени класса и бинарной операции разрешения области действия. Для обеспечения доступа в отсутствие объектов к закрытому или защищенному элементу класса должна быть предусмотрена открытая статическая функция-элемент, которая должна вызываться с добавлением перед ее именем имени класса и бинарной операции разрешения области действия. MyClass::GetD(); Начальные значения статических элементов (как открытых, так и закрытых) должны задаваться вне объявления класса. Для этого достаточно разместить где-то в файле, например, после объявления класса или среди реализаций функций-элементов (но не внутри их) оператор вида int MyClass::D = 0; Статическим данным-элементам можно задать начальные значения один и только один раз в области действия файл. Если нигде не инициализировали статический элемент данных, будет выдано сообщение компилятора о неразрешенной внешней ссылке и программа не будет скомпилирована. Если дважды инициализируется статический элемент, будет выдано сообщение о дублировании инициализации и программа также не будет скомпилирована. Приведем пример, демонстрирующий все сказанное относительно статических данных-элементов:
class MyClass { public: static int D; static int GetDl(void); … private: static int Dl; … }; int MyClass::GetDl(void) {return Dl;} int MyClass::D = 0; int MyClass::Dl = 1;
В этом примере имеются два статических элемента данных: открытый D и закрытый D1. Если пользователь должен иметь возможность получать значение закрытой статической переменной D1, то должна быть предусмотрена функция ее чтения, названная в примере GetDl. Она должна быть объявлена открытой (public) и статической (со спецификатором static). Статической может быть объявлена любая функция, работающая только со статическими данными. После объявления класса в примере расположена реализация функции GetDl. В реализации не требуется указывать спецификатор static. Далее приведены операторы, инициирующие открытые и закрытые статические данные. В дальнейшем можно из любой внешней функции обращаться к ним с помощью операции разрешения области действия. Например: i=MyClass::D; j=MyClass::GetDl(); Использование статических членов класса может заметно снизить потребность в глобальных переменных, применение которых нежелательно в принципе.
Среди данных — элементов могут быть объявлены именованные константы (их значение не может изменяться после инициализации). Например:
static const int MaxA = 10; const int MinA;
Значения статических именованных констант могут задаваться в момент их объявления в классе. Инициализация нестатических констант — вопрос более сложный, связанный с построением конструкторов. Например, в объявлении класса была константа const int A; то конструктор дополняется инициализатором элементов
MyClass::MyClass():A(10) { //тело конструктора } Задаст значение А равным 10 при создании объекта.
Для изменения нестатической константы при создании объекта необходимо использовать конструктор с параметрами
MyClass::MyClass(int i):A(i) { //тело конструктора }
Дата добавления: 2014-01-13; Просмотров: 513; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |