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;}


 

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

83261. Безопасность жизнедеятельности на объектах промышленности, строительства, транспорта, АПК и других 35.35 KB
  Аэрозоль попадает в атмосферу из дымовых факелов химических предприятий при низкой облачности и высокой влажности. За год в атмосферу попадает десятки миллионов том серного ангидрида из-за предприятий черной и цветной металлургии.
83262. Задача моделирования предпочтений ЛПР 18.02 KB
  Задача моделирования предпочтений ЛПР Изучение моделирования предпочтений имеет большое значение для разработки управленческого решения так как принятие правильных решений это область управленческого искусства.
83263. Содержание методик коррекционно-педагогической работы при брадилалии, тахилалии 39.62 KB
  При устранении брадилалии логопедические приемы направлены на воспитание более быстрых и четких речевых движений в процессе речи; убыстренных речевых реакций; темпа внутренней речи; темпов письма и чтения; выразительных форм сценического чтения и драматизированной речи...
83264. Исследование влияния браков и разводов на воспроизводство населения 64 KB
  Одними из основных факторов влияющих на процесс воспроизводства населения являются браки и разводы. Брачностью называется процесс образования брачных или супружеских пар населения. Брачность находится в тесной связи с воспроизводством населения выступая как один из важнейших факторов рождаемости и смертности.
83265. Поведінка з незнайомими людьми 662.5 KB
  Ознайомити і вивчити способи уникнення небезпеки. Розвивати здатність орієнтуватися у складних ситуаціях, вміння оцінювати небезпеку та вибирати дії самозахисту. Виховувати спостережливість, обачність, увагу, почуття обережності, дбайливе ставлення один до одного...
83266. Лісовий лікар – шипшина 129.5 KB
  Мета: забезпечувати ознайомлення дітей з корисними властивостями «лісового лікаря – шипшини»; збагачувати уявлення про звичаї українського народу, пов’язані з шипшиною; засобами поетичного слова торкатись струн дитячої душі, доносячи красу трояндового дива; виховувати потребу охороняти, доглядати...
83267. Безсмертна Леся Українка була і є, повік жива 1.22 MB
  Фотографії Лесі Українки малюнки до віршів музичний записказка Л. Олена Журлива Сьогодні 25 лютого День народження Лесі Українки. На фоні музики і демонстрації слайдів звучить вірш Олени Журливої Памяті Лесі Українки Я знала Лесю Українку Живу тривожну молоду Вона мов квітка у барвінку Цвіла в поліському саду.
83268. Як людина сприймає повідомлення. Інформація та повідомлення. Отримання людиною повідомлення 413.5 KB
  Мета уроку: формувати початкові уявлення про види повідомлень за способом її сприйняття; розвивати кругозір дітей, увагу, зорову пам’ять, логічне та операційне мислення; удосконалювати навички роботи на клавіатурі та з мишею; виховувати естетичний смак, любов до природи, бережливе ставлення до свого здоров’я.
83269. П’єса-казка Нелі Шейко-Медведєвої «Лисиця, що впала з неба» 39 KB
  Поглибити розуміння побудови тексту пєси; вчити знаходити за допомогою вибіркового читання уривки слова які характеризують дійових осіб вчити розрізняти характеристики дійових осіб за їхніми висловами вчинками; розвивати творчі здібності дітей дослідницькі якості; виховувати правдивість почуття...