89791

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

Лекция

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

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

Русский

2015-05-13

82.96 KB

2 чел.

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

Содержание

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

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


 

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

62674. Решение систем линейных уравнений способом сложения 74.55 KB
  Ход урока Организационный момент Здравствуйте ребята Вы готовы к уроку Кто сегодня дежурный Кто отсутствует Мотивация урока Сегодняшний урок я хотел бы начать с философской загадки Вальтера: Что самое быстрое но и самое медленное самое большое но и самое маленькое...
62676. Деление с остатком 18.95 KB
  Основные цели: Продолжать знакомиться с делением с остатком. Учить производить деление с остатком аналитическим способом через подбор наибольшего возможного неполного делимого...
62677. Запись решения задачи в виде одного выражения 15.99 KB
  Планируемые результаты: Предметные: Сформировать навык решения задач в виде записи решения задачи; Метапредметные: Развивать навык рещения составных задач; Личностные: Воспитывать внимательность; Этапы урока время Задачи этапа...
62678. Использование таблицы деления на 2 для решения задач на деление на равные части и деление по содержанию 22.19 KB
  Сегодня мы будем рассматривать задачи в которых используются деление на равные части и деление по содержанию. Сколько морковок в каждом пучке Прочитайте условие задачи. Прочитайте условие второй задачи.
62679. Вычитание вида 50-34. Круговые примеры. Решение составных задач 38.96 KB
  Цель: ознакомить учеников с вычитанием примеров вида 50-34; формировать активность детей на уроке, умения решать составные задачи; развивать логическое мышление, воображение; повышать мотивацию обучения, интерес к математике...
62680. Изучение новых знаний 21.65 KB
  Цель: Организация деятельности учащихся по изучению поразрядного сложения двузначных чисел без перехода через разряд Образовательная: Формировать умение слаживать двузначные числа без перехода через разряд...
62681. Задачи на сравнение 31.9 KB
  Цели: Закрепить правило разностного сравнения чисел, решение всех типов задач на сравнение, нахождение меньшего числа, большего числа и разницы. Закрепление навыка счета в пределах 9. Работа над формирование УУД.
62682. Площадь прямоугольника 58.85 KB
  Вид урока урок практикум Тип урока Комбинированный Государственный социальный заказ Во исполнение закона Российской Федерации Об Образовании Закона О Развитии Образования в г. Межпредметные связи Литературное чтение...