89791

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

Лекция

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

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

Русский

2015-05-13

82.96 KB

4 чел.

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

Содержание

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

  •  статические данные
  •  указатель 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;}


 

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

44151. Аграрная политика государства в условиях рынка 695.5 KB
  В связи с этим появились суждения о том что система колхозов способствовала развалу сельского хозяйства и лишь с ликвидацией такой системы наступит всеобщее благоденствие. Поэтому налицо отчуждение работника сельского хозяйства от земли спад интереса к сельскохозяйственному труду многие деревни опустели. Трудности развития сельского хозяйства и других отраслей АПК как показывают реформы с каждым годом только увеличиваются. Учитывая данные обстоятельства решение проблемы продовольственной безопасности страны должно представлять собой...
44152. Техническое обслуживание и ремонт электропривода ЭПЦ-1000 Д12УХЛ 340.1 KB
  Предназначен для управления рабочими органами запорной арматуры технологических и магистральных трубопроводов на объектах МН: линейной части нефтепровода, НПС (ЛПДС), нефтебаз, пунктов слива-налива, резервуарных парков, морских терминалов, а также регулирующих органов в системах автоматического регулирования давления на НПС (ЛПДС) и линейной части, трубопроводной запорной арматуры систем пожаротушения, водоснабжения и канализации, водяного охлаждения, клапанов систем автоматики отопления и вентиляции
44153. РАЗРАБОТКА МАРКЕТИНГОВОГО ПЛАНА УЧАСТИЯ В ВЫСТАВКЕ (НА ПРИМЕРЕ ООО «СЦ «СЭР», Г. ЛЕНИНСК-КУЗНЕЦКИЙ) 1.2 MB
  Целью работы является разработка плана участия в выставке для совершенствования деятельности предприятия на примере ООО Сервисный Центр СибЭнергоРесурс. Четвертая глава направлена на разработку маркетингового плана участия в выставке для ООО Сервисный Центр СибЭнергоРесурс.3 Разработка маркетингового плана участия в выставке.
44154. Инфаркт миокарда. Реанимационный этап лечения 675.5 KB
  Каждая миокардиальная клетка состоит из миофибрилл, которые состоят из длинных цепей индивидуальных саркомеров — основных сократительных единиц клетки. Каждый саркомер состоит из нитевидных структур — перекрывающихся филаментов, образованных сократительными белками — актином и миозином.
44155. Исследование проблем и разработка основных направлений совершенствования системы развития логистики запасов в ООО «Новые окна» 393 KB
  Теоретико-методологические основы логистики запасов Понятие сущность и виды материальных запасов . Необходимость существования запасов Анализ уровня развития логистики запасов в ООО Новые окна.
44156. Разработка технологического процесса ремонта тормозной системы автомобиля «BMW 3» 2.24 MB
  Продолжением ABS является система контроля торможения на поворотах СВС (Cornering Brake Control). СВС по сигналам четырех датчиков ABS узнает, что автомобиль движется на повороте. Если торможение происходит на повороте, это обычно приводит к тому, что автомобиль пытается, как бы ввернуться в поворот
44157. Разработка нейросетевого алгоритма, выполняющего быстрое и точное распознавание входных 3-х мерных образов 943.5 KB
  В ходе данной работе будет разработан нейросетевой алгоритм, выполняющий быстрое и точное распознавание входных 3-х мерных образов. Будут проведены анализ эффективности работы этой сети в сравнении с аналогичными возможностями человека
44158. БИЗНЕС-ПЛАН ООО «ТПК«МиГ» 1.46 MB
  Цель исследования - дать представление о деятельности рассматриваемого предприятия; выявить его возможности при реорганизации производства по увеличению выпуска продукции и расширению ассортимента; исследовать процесс управления освоением новой продукции, рассмотреть бизнес-план предприятия как инструмента управления освоением продукцией