|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Статические данные классовЕсли поле данных класса описано с ключевым словом static, то значение этого поля будет одинаковым для всех объектов данного класса. Статические данные класса полезны в тех случаях, когда необходимо, чтобы все объекты включали в себя какое-либо одинаковое значение. Статическое поле по своим характеристикам схоже со статической переменной: оно видимо только внутри класса, но время его жизни совпадает со временем жизни программы. Таким образом, статическое поле существует даже в том случае, когда не существует ни одного объекта класса. Тем не менее, в отличие от статической переменной функции, предназначенной для сохранения значения между вызовами, статическая переменная класса используется для хранения данных, совместно используемых объектами класса. Применение статических полей класса Допустим, вам необходимо, чтобы объект вашего класса располагал информацией, сколько еще объектов этого же класса существует на данный момент времени в памяти. В этом случае можно включить в класс статическую переменную count. Эта переменная будет доступна всем объектам класса, и все они будут видеть одно и то же ее значение. #include <iostream> using namespace std; class foo { private: static int count; // общее поле для всех объектов public: foo() // инкрементирование при создании объекта { count++; } int getcount() // возвращает значение count { return count; } }; int foo::count = 0; // *определение* count int main() { foo f1, f2, f3; // создание трех объектов, каждый объект видит одно и то же значение cout << "Число объектов: " << f1.getcount() << endl; cout << "Число объектов: " << f2.getcount() << endl; cout << "Число объектов: " << f3.getcount() << endl; return 0; } В этом примере класс foo содержит единственное поле count, имеющее тип static int. Конструктор класса инкрементирует значение поля count. В функции main() мы определяем три объекта класса foo. Поскольку конструктор в этом случае вызывается трижды, инкрементирование поля count также происходит трижды. Метод getcount() возвращает значение count. Мы вызываем этот метод для каждого из объектов, и во всех случаях он возвращает одну и ту же величину. Если бы мы использовали не статическое, а автоматическое поле count, то конструктор увеличивал бы на единицу значение этого поля для каждого объекта. Статические поля класса применяются гораздо реже, чем автоматические, однако существует немало ситуаций, где их использование удобно. Раздельное объявление и определение полей класса Определение статических полей класса происходит не так, как для обычных полей. Обычные поля объявляются и определяются при помощи одного оператора. Для статических полей эти два действия выполняются двумя разными операторами: объявление поля находится внутри определения класса, а определение поля, как правило, располагается вне класса и зачастую представляет собой определение глобальной переменной. Если бы определение статического поля класса находилось внутри класса, то это нарушило бы принцип, в соответствии с которым определение класса не должно быть связано с выделением памяти. Поместив определение статического поля вне класса, мы обеспечили однократное выделение памяти под это поле до того, как программа будет запущена на выполнение. Работая со статическими данными класса, легко совершить ошибки, которые компилятор будет не в силах распознать. Если вы объявите статическое поле класса, но забудете его определить, компилятор не выдаст предупреждающего сообщения. Ваша программа будет считаться корректной до тех пор, пока редактор связей не обнаружит ошибку и не выдаст сообщение о том, что вы пытаетесь обратиться к необъявленной глобальной переменной. Это произойдет в том случае, если вы забудете указать имя класса при объявлении.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.005 сек.) |