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


 

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

39426. Разработать программное обеспечение для работы со структурными типами данных с реализацией премирования по факультетам 371 KB
  Функции. Она работает с определенной конкретной базой данных; в ней в основном используются сложные типы данных структуры и функции то есть структура программы не требует много ресурсов. Они создаются из базовых: Массивы объектов заданного типа; Функции с параметрами заданных типов возвращающие значение заданного типа; Указатели на объекты или функции заданного типа; Ссылки на объекты или функции заданного типа; Константы которые являются значениями заданного типа; Классы содержащие последовательности объектов...
39427. Разработка линии связи между ОП1 (Гомель) и ОП2 (Мозырь) через ПВ (Наровля) 281 KB
  В состав оборудования ИКМ120 входят: оборудование вторичного временного группообразования ВВГ конечное оборудование линейного тракта ОЛТ необслуживаемые регенерационные пункты НРП а также комплект контрольноизмерительных приборов КИП. Сформированный в оборудовании ВВГ цифровой сигнал в коде МЧПИ или ЧПИ HDB3 или MI поступает в оконечное оборудование линейного тракта которое осуществляет согласование выхода оборудование ВВГ с линейным трактом дистанционное питание НРП телеконтроль и сигнализацию о состоянии оборудования линейного...
39429. МНОГОКАНАЛЬНЫЕ СИСТЕМЫ ПЕРЕДАЧИ (цифровые) 1.6 MB
  Таблица 2 – Основные параметры системы передачи Параметр Значение параметра Число организуемых каналов Скорость передачи информации кбит с Тип линейного кода Амплитуда импульсов в линии В Расчетная частота кГц Номинальное затухание участка регенерации дБ Номинальное значение тока ДП мА Допустимые значения напряжения ДП В Максимальное расстояние ОРПОРП Максимальное число НРП между ОРП Максимальное число НРП в полу секции ДП 1. Для размещения НРП необходимо определить номинальную длину участка регенерации lном. Число НРП между...
39430. Цифровые системы передачи (ЦСП) 322.5 KB
  Целью данного курсового проекта является формирование у студентов твердых теоретических знаний в области современных систем телекоммуникаций а также приобретение ими практических навыков и умений по технической эксплуатации и техническому обслуживанию цифровых систем передачи работающих на сети связи Республики Беларусь. Задачи курсового проектирования: изучение основ теории цифровых систем передачи и принципов построения образованных на их базе каналов передачи для видов первичных электрических сигналов телефонных телеграфных звукового...
39432. ПРОЕКТИРОВАНИЕ ЦИФРОВОЙ ЛИНИИ ПЕРЕДАЧИ. Расчет напряжения дистанционного питания 106.5 KB
  Расчет вероятности ошибки. Расчет затухания участков регенерации Для проверки правильности предварительного размещения НРП необходимо определить вероятность ошибки которая зависит от величины защищенности.3 Расчет вероятности ошибки. Расчет допустимой вероятности ошибки Переходные помехи и собственные шумы корректирующих усилителей приводят к появлению ошибок в цифровом сигнале которые вызывают искажение передаваемой информации.
39433. ЦИФРОВЫЕ И МИКРОПРОЦЕССОРНЫЕ УСТРОЙСТВА 2.49 MB
  наук Ц75 Цифровые и микропроцессорные устройства : методические указания и задания к курсовому проекту для студентов специальностей 245 01 03 – Сети телекоммуникаций 245 01 02 – Системы радиосвязи радиовещания и телевидения. УДК ББК ISBN Учреждение образования Высший государственный колледж связи 2011 ВВЕДЕНИЕ Курсовой проект по дисциплине Цифровые и микропроцессорные устройства выполняется студентами специальностей 2–45 01 02 Системы радиосвязи радиовещания и телевидения 2–45 01 03 Сети телекоммуникаций третьего курса...
39434. МНОГОКАНАЛЬНЫЕ СИСТЕМЫ ПЕРЕДАЧИ (ЦИФРОВЫЕ) ЦСП 591.5 KB
  Выбор и характеристика системы передачи. В большинстве промышленно развитых стран осуществляется массовый выпуск цифровых систем передачи ЦСП использующих принципы импульснокодовой модуляции ИКМ и предназначенных для организации многоканальной передачи по городским соединительным линиям между АТС а также по междугородным линиям связи. В нашей стране применяется аппаратура для городских телефонных сетей обеспечивающих организацию 30 каналов ТЧ первичная система передачи ИКМ30 аппаратура для городских и зоновых...