Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Лекция 13. Статические элементы класса

Статические элементы класса

 

Элементы класса (как поля, так и методы) могут быть статическими.

Статический элемент класса может использоваться всеми объектами, но храниться в одном экземпляре. К статическому элементу можно обращаться еще до создания объектов.

При объявлении статического поля в классе ему не выделяется память, так как класс – это абстрактный тип.

Чтобы разместить статическое поле в памяти, следует объявить его глобально с помощью оператора разрешения области видимости.

Статическое поле инициализируется нулем по умолчанию еще до создания объектов.

Пример:

 

#include <iostream.h>

class variable

{public:

static int a;//статическое поле

};

 

int variable::a;

void main()

{ variable::a=100;//определение статической переменной

cout<<”a=”<< variable::a<<”\n”;

variable x;//создание объекта

cout<<”x.a=”<<x.a;

}

 

В данном примере мы обращаемся к общедоступному полю двумя способами:

<имя класса>::< имя поля>

<имя объекта>.<имя поля>

Первый способ является более предпочтительным, поскольку позволяет обращаться к статическому полю, когда объект еще не определен.

Статические элементы можно использовать, например, для хранения адреса начала списка объектов или для подсчета количества созданных объектов.

Если приописании класса статической переменной присвоить статус private, то компилятор выдаст сообщение о невозможности доступа к этой переменной.

Однако к закрытому статическому полю можно обращаться извне через статический метод.

Статическая функция существует только в одном экземпляре и обрабатывать она должна только статическое поле.

Обращение к статической функции осуществляется двумя способами:

<имя класса>::< обращение к функции>

<имя объекта>.<обращение к функции>

 

Рассмотрим пример использования статической функции, которая вычисляет количество созданных точек в трехмерном пространстве.

 

#include <iostream.h>

class point3//точка в трехмерном пространстве

{double x, y, z;

static int N;//счетчик

public:

point3(double xn, double yn, double zn)

{N++; x=xn; y=yn; z=zn;}

static int count()

{return N;}

};

int point3::N=0;

void main()

{point3 A(0.0,1.0,2.0);

cout<<”\nsizeof(A)=”<<sizeof(A);

point3 B(3.0, 4.0, 5.0);

cout<<”\nОпределены”<<point3::count()<<”точки”;

point3 C(6.0, 7.0, 8.0);

cout<<”\nОпределены”<<C.count()<<”точки”;

}

 

Результат:

sizeof(A)=24

Определены 2 точки

Определены 3 точки

 

Дружественные функции

 

В языке С++ доступ к закрытым полям класса осуществляется с помощью методов. Однако существует еще одна возможность доступа к закрытым элементам с помощью функций, которые не принадлежат классу. Для этого достаточно объявить эти функции “дружественными” по отношению к рассматриваемому классу. с помощью спецификатора friend. Дружественная функция может быть описана в любой части класса, так как она не принадлежит классу.

Доступ к закрытым полям класса дружественная функция получает через объект класса, который должен ей передаваться через аргументы.

Рассмотрим пример класса с дружественной функцией.

 

#include <conio.h>

class char_loc

{int x, y;//координаты точки на экране

char ch;//символ

friend void put(char_loc *, char);// прототип дружественной функции

public:

char_loc(int xi, int yi, char c)

{x=xi; y=yi; ch=c;}

void display()//выводит символ ch в позицию экрана (x,y)

{gotoxy(x,y);

putch(ch);//вывод символа в текущую позицию экрана

}

};

void put(char_loc *p, char c)

{p->ch=c;}

void main()

{char_loc D(20,4,’d’);

char_loc S(10,10,’s’);

clrscr();

D.display();

getch();

S.display();

getch();

put(&D,’*’);

/*дружественная функция записывает символ ‘*’ в поле ch объекта D */

D.display();

getch();

put(&S,’#’);

S.display();

getch();

}

 

В результате программа в точке (20,4) экрана выводит символ d, затем в точке (10,10) символ s, а затем последовательно в точке (20,4) символ *, а в точке (10,10) – символ #.

Дружественная функция получает доступ к закрытому полю ch объекта, адрес которого ей будет передан.

Функция может быть дружественной по отношению к нескольким классам.

Рассмотрим пример.

Определим два класса: circ и square, которые характеризуют соответственно окружность и квадрат. Одной из характеристик обоих классов является цвет геометрической фигуры. Чтобы можно было сравнивать цвет окружности и квадрата, определим дружественную функцию, которая получив доступ к закрытому цвету каждого

 

 

объекта, возвращает значение “истина”, если цвета совпадают, и значение “ложь” в противном случае.

 

#include <iostream.h>

class square;//опережающее описание класса для использования в дружественной функции

enum colors{red, white, green, yellow};

class circ

{colors c;

public:

circ(colors a)

{c=a;}

friend bool f(circ x, square y);//прототип друга класса circ

};

class square

{colors c;

public:

square(colors a)

{c=a:}

friend bool f(circ x, square y);//прототип друга класса square

};

//определение дружественной функции

bool f(circ x, square y)

{if(x.c==y.c)

return true;

else

return false;

}

void main()

{circ circle1(red);

square square1(green);

if(f(circle1, square1))

cout<<”Объекты одинакового цвета.\n”;

else

cout<<”Объекты разных цветов.\n”;

}

 

Дружественная функция, имеющая доступ к двум классам, должна быть объявлена в обоих классах.

<== предыдущая лекция | следующая лекция ==>
Условия, допускающие представление о движении газа как сплошной среды | Квантовомеханическое описание состояния электрона в атоме. Принцип Паули. Структура электронных оболочек атома
Поделиться с друзьями:


Дата добавления: 2014-01-07; Просмотров: 553; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.