89791

Компоненты класса

Лекция

Информатика, кибернетика и программирование

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

Русский

2015-05-13

82.96 KB

3 чел.

Компоненты класса

Содержание

Компоненты класса

  •  статические данные
  •  указатель this
  •  функции
  •  компонентные
  •  статические static
  •  постоянные const
  •  указатели на функции
  •  дружественные функции и классы
  •  перегруженные функции
  •  перегруженные операции

Статические данные 

Объявляются перед компонентой класса ключевым словом static. Они не «дублируются» при создании объектов класс. Доступ к статическому компоненту возможен только после его инициализации:

тип имя_класса::имя_компоненты = инициализатор;

Пример #5. Товары на складе

Рассмотрим класс, описывающий товары на складе магазина. Компонентами класса будут:

  •  Название товара
  •  Оптовая (закупочная) цена
  •  Розничная (торговая) наценка (в %)
  •  Функция ввода данных о товаре
  •  Функция печати (вывода на дисплей) сведений о товаре

//Googs.cpp-класс «товары на //складе магазина»

#include <iostream.h>

struct goods

{char name[40];

float price;

static int percent;

void Input()

{ cout<<“Наименование товара:”; cin>>name;

cout<<“Закупочная цена:”; cin>>price;}

void Display() { cout<<“\n”<<name;

cout<<“, розничная цена: ”;

cout<<long(price*(1.0+ goods::percent*0.01));}

};

//main5.cpp

#include <iostream.h>

#includegoods.cpp

//инициализация статической компоненты

int goods::percent =12;

int main()

{ goods wares[5]={{“мужской костюм, 1900},

{“косметический набор, 276}, {“калькулятор,110}};

int k=sizeof(wares)/ sizeof(wares[0]);

cout<<“\n Введите сведения о товарах:\n”;

for (int i=3; i<k; i++) wares[i].Input();

cout<<“\nСписок товаров при наценке\n” <<wares[0].percent<<“%”;

for (int i=0; i<k; i++) wares[i].Display();

//Изменение статической компоненты

goods::percent=10;

cout<<“\nСписок товаров при наценке\n” <<wares[0].percent<<“%”;

/*указатель на объекты класса инициализирован значением адреса первого элемента массива объектов &wares[0]*/

goods *pGoods=wares;

for (int i=0; i<k; i++) pGoods++->Display();

return 0;}

Указатель this

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

Этот указатель имеет фиксированное имя this и незаметно для программиста определен в каждой функции класса:

имя_класса *const this=адрес_обрабатываемого объекта;

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

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

Пример #6. Двухсвязный список

//member.h

class member

{//адрес последнего элемента списка

static member * last_memb;

member *prev; //на предыдущий элемент

member *next; //на следующий элемент

char bukva; // содержимое элемента списка

public:

member (char cc) {bukva=cc;}//конструктор

void add ();//добавление элемента в конец списка

static void reprint (void);//вывод содержимого списка

};

//Member.cpp

#include <iostream.h>

#include <stdio.h>

#includemember.h

void member::add(void)

{ if (last_memb==NULL) this->prev=NULL;

else (last_memb->next==this);

this->prev=last_memb;

last_memb=this;

this->next=NULL;

};

void member::reprint(void)

{member *uk; //вспомогательный указатель

uk=last_memb;

if (uk==NULL) {cout<<“\n Список пуст!”; return;}

else cout<<“\nСодержимое списка: \n”;

while (uk!=NULL) {cout<< uk->bukva<<‘\t’;

uk=uk->prev;}

};

//programs.cpp

#include <iostream.h>

#includemember.h

member *member::last_memb=NULL;

void main()

{   member A(‘a’); member B(‘b’);

member C(‘c’); member D(‘d’);

member::reprint();

A.add(); B.add(); C.add(); D.add();

member::reprint();

}

Компонентные функции класса

С++ предоставляет возможность определять встраиваемые inline-функции. 

inline double& re(void){ return real; }

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

Функции-члены типа static

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

Функции-члены типа const

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

Пример #7. Вычисление оклада

#include <iostream.h>

class salary{

public://оклад

void init(int b){b_sal=b; your_bonus=0; }

void calc_bonus(int perc)

{your_bonus=b_sal*perc/100;}//личная премия

static void reset_all(int p)

{all_bonus=p;}//премия для всех сотрудников

int comp_tot() const //суммарный оклад

{return (b_sal+your_bonus+all_bonus);}

salary(){b_sal=0; your_bonus=0};

private: int b_sal;

int your_bonus;

static int all_bonus;

};

int salary::all_bonus=100;

int main() { salary w1,w2;

w1.init(1000); w1.calc_bonus(20);

w2.init(2000); w2.calc_bonus(15);

cout<<“ w1=“<<w1.comp_tot();

cout<<“ w2=“<<w2.comp_tot();

salary:: reset_all(400);

cout<<“ w1=“<<w1.comp_tot();

cout<<“ w2=“<<w2.comp_tot();

return 0;

}

Указатели на компоненты класса

Для доступа к компонентам класса через указатель используется следующий формат:

Тип_возвращаемого_функцией_значения (имя_класса::*имя_указателя_на_метод) (спецификация_параметров_функции);

Тип_данных (имя_класса::*имя_указателя);

Для получения адреса компоненты:

&имя_класса::имя_компоненты_public

Разыменование указателя на компоненты класса:

Имя_объекта.*указатель_на_компонент _данных

Имя_объекта.*указатель_на_метод (параметры)

Если определен указатель на объект класса, то его разыменование происходит с помощью бинарной операции->*’:

Указатель_на_объект_класса->*указатель _на_компонент_данных

Указатель_на_объект_класса->*указатель _на_метод (параметры)

Пример для класса complex:

complex A(22.2, 33.3);//объект класса

complex *pComplex=&A; //указатель класса

void (complex::*pdisplay)();//указатель на //компонентную функцию

pdisplay=&complex::display;//настройка указателя

(pComplex->*pdisplay)();/*вызов компонентной функции через указатель на объект класса и указатель на компонентную функцию*/

Указатель на член класса

Указатель на тип члена класса выглядит как 

T::*

где Т-имя класса.

Для разыменования указателя на член класса используются два оператора:

.*

->*

Пример #8

#include <iostream.h>

class X{

public:

int visible;//видимая

void print()

{cout<< “\n hide=”<<hide<<
visible=“<<visible;}

void reset(){visible=hide;}

void set(int i){hide=i;}

private:

int hide; // спрятанная

};

typedef void (X::*pfcn)();

int main()

{

X a, b, *pb=&b;

int X::*pXint=&X::visible;

pfcn pF=&X::print;

a.set(8); a.reset();  //a.visible=a.hide=8

b.set(4); b.reset();  //b.visible=b.hide=4

a.print();

a.*pXint += 1;        //a.visible+=1;

a.print();

cout<<“\n b.visible=“<<pb->*pXint;

(b.*pF)();               //b.print();

pF=&X::reset;

(a.*pF)();               //a.reset();

a.print();

return 0;}


 

А также другие работы, которые могут Вас заинтересовать

14526. Единая сельскохозяйственная политика Европейского союза 76 KB
  Единая сельскохозяйственная политика Европейского союза 1.Необходимость и цели ЕСХП 2.Начало ЕСХП 3.Современные реформы ЕСХП 4. Реформа сахарного режима 2005 2006 Единая сельскохозяйственная политика Европейского союза англ. Common Agricultural Policy система сельскохозя
14527. Образование Европейских сообществ и становление европейского Союза 113 KB
  Образование Европейских сообществ и становление европейского Союза 1.Исторические предпосылки и основные этапы становления Европейских сообществ Формирование Европейских сообществ и европейского права это единовременный и тесно взаимосвязанный процесс. Создани...
14528. Сущность, предпосылки, цели и эффекты интеграции 50.5 KB
  Понятие МЭИ. Объективная необходимость и историческая неизбежность МЭИ В условиях интернационализации мировой экономики растет зависимость развития каждой национальной экономики от внешних факторов. Это подтверждается ростом мирового товарооборота объемов ...
14529. Сущность, предпосылки, цели и эффекты интеграции 155.5 KB
  Сущность предпосылки цели и эффекты интеграции 1.Сущность предпосылки цели и эффекты интеграции 2.Теории международной экономической интеграции 3.Главные интеграционные группировки мира 4.Особенности интеграции в Североамериканском регионе 5.Экономическая ин
14530. Теории европейской интеграции 110 KB
  ТЕМА 1. Теории европейской интеграции 1.Понятие интеграции: проблемы дефиниции 2.Теории политической интеграции 3.Социологический подход к изучению европейской интеграции 4.Экономикотеоретический подход к изучению европейской интеграции 5.Правовой подход к изу...
14531. Европейский Суд 127.5 KB
  Европейский Суд Экономический и социальный комитет 3.Комитет регионов Европейского Союза КОР 1.Европейский Суд Европейский Суд без натяжек можно признать стержневым органом в системе институтов ЕС. Но он бы не смог стать таковым если бы не была проявлен
14532. Европейская счетная палата 127.5 KB
  I. Европейская счетная палата 1.СозданииЕвропейской счетной палаты 2.Мандатчленов Европейской счетной палаты. Полномочия. 3.СоставЕвропейской счетной палаты. 4.Организационная структура Европейской счетной палаты 5.Сотрудничествос другими институтами и организ...
14533. Римские Договора 1957 года. Образование Европейского Экономического Сообщества (ЕЭС) и Европейского Сообщества по Атомной Энергетике (Евратома) 30.76 KB
  Римские Договора 1957 года. Образование Европейского Экономического Сообщества ЕЭС и Европейского Сообщества по Атомной Энергетике Евратома Римский договор 1957 года: Создание ЕЭС 25 марта 1957 года в Риме были подписаны договора о создании ЕЭС и Евратома. 1 января 1958 го
14534. БРЮССЕЛЬСКИЙ ДОГОВОР 1965 ГОДА 19.03 KB
  Брюссельский Договор 1965 года В ЕЭС как и в Евратоме были созданы институты почти повторившие те которые существовали в ЕОУС. Существование параллельных институтов в ЕЭС и в Евратоме сразу было признано нецелесообразным. Об этом было заявлено в конвенции принятой в Ри