|
Программирование >> Аргументация конструирования
Статические члены В эЛой главе... Определение статических членов У Объявление статических функций-членов / Бюджет с классами - BUDGET2 . СРР Я ж о умолчанию данные-члены создаются отдельно для каждого объекта. Нанри-С мер, каждый студент имеет свое собственное имя. Однако, кроме того, вы можете создавать данные-члены, используемые всеми объектами класса совместно, объявив их статическими. Несмотря на то что термин статический нрименим как к данным-членам, так и к функциям-членам, для данных и для функций его значение несколько различно. В этой главе рассматриваются оба типа и их отличия. OnfieqexeHMe ашЮничеаашленов Данные-члены можно сделать общими для всех объектов класса, объявив их статическими (static). Такие члены называются статическими данными-членами (я бы удивился, если бы они назывались по-другому...). Зачем нужны статические данные Большинство свойств класса являются свойствами отдельн1х объектов. Если использовать избитый (точнее, очень избитый) пример со студентами, можно сказать, что такие свойства, как имя, идентификационный номер и пройденные курсы, являются специфическими для каждого отдельного студента. Однако есть свойства, которые распространяются на всех студентов, например количество зачисленных студентов, самый высокий балл среди всех студентов или указатель на первого студента в связанном списке. Такую информацию можно хранить в обшей (и ставшей привычной) глобальной переменной. Например, можно использовать простую целочисленную переменную для отслеживания количества объектов student. Однако при таком подходе возникает проблема, связанная с тем, что эти переменные находятся снаружи класса. Это подобно, например, установке регулятора напряжения моей микроволновой печи где-нибудь в спальне. Конечно, так можно сделать, и печь, вероятно, даже будет нормально работать, но моя собака во время очередной пробежки по квартире может наступить на провода и ее придется соскребать с потолка, что вряд ли доставит мне удовольствие (собаке, я думаю, это тоже не очень-то понравится). Если уж создавать класс, полностью отвечающий за свое состояние, то такие глобальные переменные, как регулятор напряжения, нужно хранить внутри класса, подальше от неаккуратных собачьих лап. Это и объясняет необходимость статических членов. Вы могли слышать, что статические члены также называют членами класса, поскольку они доступны для всех объектов класса. Чтобы подчеркнуть отличие от статических членов, обычные члены называют компонентами экземпляра или членами объекта, поскольку каждый объект имеет собственный набор таких членов. Использование статических членов Статические данные-члены объявляются в классе с помощью ключевого слова static, как показано в приведенном ниже примере. class Student public: Student fcha me - no name ) strcpy(name, pName); J noOfStudents++; -StudentO noOfStudents-; int number 0 return noOfStudents; protected: static int noOfStudents; char name[40); Student si; Student s2; Член noOfStudents входит в состав класса student, но не входит в состав объектов si и s2. Таким образом, для любого объекта класса student существуют отдельные члены name и только один noOfStudents, который доступен для всех объектов класса student. Хорошо, - спросите вы, - если место под noOfStudents не выделено ни в каком объекте класса то где же он находится? Ответ прост: это место не деляется. Вы должны сами выделить для него место так, как показано ниже. int student;:noOfStudents - О; Этот своеобразный синтаксис вьщеляет место для статического члена класса и инициализирует его нулем. Статические данные-члены должны бьпь глобальными (как статические переменные не могуг быть локальными по отношению к некоторой функции). Для любого члена, имя которого встречается вне класса, требуется указание класса, к которому он принадлежит. Обращение к статическим данным-членам Правила обращения к статическим данным-членам те же, что и к обычным членам. Из класса к статическим членам обращаются так же, как и к другим членам класса. К открытым статическим членам можно обращаться извне класса, а к защищенным - нельзя, как и к обычным защищенным членам. class Student public: student() i обращение из класса . остальнаяпрограмма. . . static int noOfStudents; ...TO же, что и раньше... voi enCi si, Student s2) [ обращение к открытому статическому члену cout Количество студентов - в1 .noOf Students обращение извне << \п ; класса В функции fn () происходит обращение к с использованием объек- та з1. Однако, носкодьку si и s2 имеют одинаковый доступ к чдену noOfStudents, возникает вопрос: почему я выбрал именно si? Почему я не использовал s2? На самом деле это не имеет значения. Вы можете обращаться к статическим членам, используя любой объект класса, например, так: . . ,кл£сс определяется так же, как и раньше.. . void fniStudents si. Student s2) 1 представленные команды приведут к идентичному результату cout Количество студентов - sl.noOEStudents << \n ; cout Количество студентов - s2.noOfStudents \n ; На самом деле нам вообще не нужен объект! Можно использовать просто имя класса, как показано в следующем примере: II... клр.СС определяется так же, как и раньше . . . void fn;student& si, Student s2) результат ется неизменнхм cout << Количество студентов - Student::noOfStudents << \n ; Независимо от того, будете ли вы использовать имя объекта или нет, C++ все равно будет использовать имя класса. Объект, используемый для обращения к статическому члену, никак не обрабатывается, даже если это обращение явным образом указано в выражении. Для того чтобы понять, что я имею в виду, рассмотрим приведенный ниже пример. class Student static int noOfStudents; Students nextStudent ( ) ; / / , . . TO же, что и раньше.. . void s) cout о .noOfStudents << \п ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |