|
Программирование >> Аргументация конструирования
Функция-чле tudent (> в этом примере не вызывается. Все, что нужно знать С++ для обращения к noOfStudents, - это тин возвращаемого значения, а он может это выяснить и не выполняя эту функцию. Хотя этот пример и маловразумите лен, но так оно и будет6. Применение статических данных-членов Существует бесчисленное множество областей применения статических данных-членов, но здесь мы остановимся лищь на нескольких из них. Во-нервых, можно использовать статические члены для хранения количества объектов, задействованных в программе. Например, в класса dent такой счетчик можно проинициализировать нулем, а затем увеличивать его на единицу внутри конструктора и уменьшать внутри деструктора. Тогда в любой момент этот статический член будет содержать количество существующих в данный момент объектов класса Student. Однако следует помнить, что этот счетчик будет содержать количество объектов, существующих вданный момент (включая временные объекты), а не количество студентов17. Еще один способ использования статических членов заключается в индицировании выполнения определенного действия. Например, классу Radio может понадобиться инициализировать некие аппаратные средства при первом выполнении команды tune, но не перед последующими вызовами. С помощью статического члена можно указать, что первый вызов tune уже выполнил инициализацию. Кроме всего прочего, статический член может служить указателем безошибочности инициализации аппаратных средств. И наконец, в статических членах можно хранить указатель на первый элемент связанного списка. Таким образом, статические члены могут содержать любую информацию общего использования , которая будет доступна для всех объектов и во всех функциях (не стоит забывать, однако, что чрезмерное использование статических переменных усложняет поиск ошибок в программе). OibstSxeHue аЯаМичеасих Функции-члены также могут быть объявлены статическими. Подобно статическим дапным-членам, они связаны с классом, а не с каким-либо отдельным объектом класса. Это означает, что обращение к статическим функциям-членам, как и к статическим данным-членам, не требует наличия объекта. Если объект и присутствует, то используется только его тип. Таким образом, оба вызова статической функции-члена number О в приведенном ниже примере легальны. ttinclude <iQstred.ra.h> ttinclude <string.h> Вообще говоря, это зависит от используемого компилятора. Так, GNU С + +не будет вызывать функцию, в то время как Borland С++ или Watcom С++ сделает это. - Прим. ред. 17 Еще одно замечание: в этом случае вы должны позаботиться о том, чтобы счетчик увеличивался во всех конструкторах, включая конструктор копирования. - Прим. ред. class Student { public: static int return noOfStudents; стальное то же , что и ранее . . . protected: static int noOfStudents; char name[40]; int Student::noOfStudents = 0; int main(int argcs, char* pArgs[]) { Student s; cou- < шпЬег{) << \n ; cout student::number() \n ; return 0; Обратите внимание на то, как статическая функция-член обращается к статическим данным-членам. Поскольку статическая функция-член не связана с каким-либо объектом, она не может неявно обращаться к нестатическому члену. Таким образом, приведенный ниже пример неправилен. class Student public: приведенный ниже код неверен static char *sWame() return name; Какое именно имя? . , .все остальное то же, что и ранее... protected: char name[40]; static int noOfStudents; Это не означает, что статические функции-члены не имеют доступа к нестатическим данным-членам. Рассмотрим следующий пример: ttinclude <iostream.h> #include <string.h> class Student public: ie же конструктор и деструктор, что и ранее, однако конструктор обеспечивает вставку объекта е связанный список (как это делается, сейчас для нас неважно... Student (char *pName); -Student О ; findName - возвращает студента с указанным именем static Student* findName(char *pName); protect ed: static Student *pFirst; Student *pNext; char name[40]; Student* Student::pFirst = 0; findName - возвращает студента с указанным именем либо ноль, если такой студент не был Student* Student::findName(char *pName) просмотрим связанный список... for (Student *pS = pFirst; pS; pS = pS->pNext) { если указанное имя найдено... if (strcmp(pS->name, pName) == 0) ...TO возвращаем адрес этого объекта return pS; в противном случае возвращаем не найден) return (Student*)0; int r(\ain(int argcs, char* pArgs [ ] ) { Student si( Randy ); Student s2( Jenny ); Student s3( Kinsey ); Student *pS = Student::findName( Jenny ); return 0; Функции Name () имеет доступ к pFirst, поскольку этот указатель доступен всех объектов. Так как findName является членом класса student, он имеет доступ к членам name объектов, однако при вызове необходимо уточнить, член какого именно объекта требуется. Статическая функция не связана с каким-либо определенным объектом, и делу не поможет даже использование объекта при вызове статического члена. int main(int argcs, char* pArgs[]) Student si( Randy ); Student s2( Jenny ); Student s3( Kinsey ); Student *pS = si.findName( Jenny ); return 0; Объект si не передается функции findName О; компилятор использует только класс этого объекта, для того чтобы знать, функцию findName () какого именно класса следует вызвать. Статические функции-члены удобны, когда вам надо связать некое действие с классом, не связывая его с отдельным объектом. Например, функция-член Duck: : fly() (Утка:: полет ()) ассоциируется с определенной уткой, тогда как более трагичная функция Duck: :goExtinct(> (Утка {):: Вымирание ()) связана со всем утиным племенем (читай: классом).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |