Программирование >>  Аргументация конструирования 

1 ... 64 65 66 [ 67 ] 68 69 70 ... 108


Функция-чле 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(> (Утка {):: Вымирание ()) связана со всем утиным племенем (читай: классом).



1 ... 64 65 66 [ 67 ] 68 69 70 ... 108

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика