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


 

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

84589. Поворотно-протипоточна система нирок її фізіологічні механізми і роль 52 KB
  Поворотнопротипоточна система нирки ППСН забезепчує при необхідності: розведення сечі тобто виводить у великому обємі води малу кількість солей та метаболітів. Так нирки працюють при надлишку води в організмі наприклад при надлишковому її прийомі. концентровання сечі тобто виводять у малому обємі води велику кількість солей та метаболітів. Регуляція реабсорбції йонів натрію і води в канальцях нирки.
84590. Роль нирок в забезпеченні кислотно-основного стану крові 38.28 KB
  Роль нирок у підтримці кислотноосновного стану крові повязана із здатністю епітеліоцитів ниркових канальців секретувати протони які надалі виводяться з організму. Протони секретуються в просвіт канальців а бікарбонатні йони реабсорбуються у кров. Протони котрі секретуються нирковим епітелієм взаємодіють з різними компонентами сечі.
84591. Фізіологія як наука. Поняття про функцію. Методи фізіологічних досліджень 44.59 KB
  Нормальна фізіологія наука про обєктивні закономірності протікання функцій організму в їх взаємозвязку і у взаємодії організму із зовнішнім середовищем. Функція це діяльність і властивість клітин органів систем організму які проявляються як фізіологічний процес чи сукупність процесів. Неспецифічні притаманні багатьом чи всім тканинам та клітинам організму. Обєктом фізіологічного дослідження є функція організму його систем органів і клітин.
84592. Потенціал спокою, його параметри, механізми походження та фізіологічна роль 49.49 KB
  Формула Нернста для розрахунку величини ПС: де R універсальна газова стала T абсолютна температура F число Фарадея [K і] концентрація іонів К в клітині [K е] концентрація іонів К поза клітиною. Особливостями проникності мембрани клітини в стані спокою вона проникна для іонів К та непроникна для іонів N. Цей білок на внутрішній поверхні мембрани розщеплює АТФ на АДФ та фосфат й використовує енергію що виділилась на транспортування трьох іонів N з клітини та двох іонів К в клітину. Отже за рахунок роботи НКН...
84593. Потенціал дії, його параметри, механізми походження та фізіологічна роль 47.44 KB
  При внутрішньоклітинній мікроелектродній реєстрації ПД окремої клітини має такий вигляд: Спочатку мембранний потенціал різко зменшується до нуля 1 фаза деполяризації ПД; потім заряд мембрани змінюється на протилежний зовні всередині 2 фаза реверсполяризації. Далі мембранний потенціал поступово повертається до вихідного рівня 3 фаза реполяризації ПД. Так розвивається фаза деполяризації ПД. Але вхід іонів N в клітину не припиняється й тепер у клітині створюється надлишок позитивних іонів N а на її поверхні надлишок аніонів...
84594. Збудливість. Критичний рівень деполяризації поріг деполяризації клітинної мембрани 43.2 KB
  Критичний рівень деполяризації поріг деполяризації клітинної мембрани. Пороговий потенціал ΔV різниця між ПС та критичним рівнем деполяризації мембрани Екр. Критичний рівень деполяризації той рівень мембранного потенціалу при зменшені до якого ПС на мембрані виникає ПД. Тобто чим менший поріг деполяризації тим вища збудливість клітини та навпаки.
84595. Зміни збудливості клітини при розвитку одиничного потенціалу дії 46.03 KB
  При розвитку на мембрані місцевого збудження та ПД збудливість клітини змінюється порізному: при розвитку місцевого збудження збудливість збільшується так як ΔV зменшується; при розвитку ПД мають місце закономірні зміни збудливості: поки деполяризація повільно прямує до Екр збудливість збільшується вище вихідного рівня вище 100 фаза супернормальної збудливості; к тільки деполяризація доходить до Екр й починається розвиток піку ПД збудливість клітини падає до нуля та починається фаза абсолютної рефрактерності повної...
84596. Значення параметрів електричних стимулів для виникнення збудження 43.28 KB
  Під анодом виникає гіперполяризація а під катодом деполяризація мембрани внаслідок складання зовнішнього та власного електричного поля. Коли під катодом відбувається деполяризація мембрани й досягає 5075 від величини порогового потенціалу в мембрані відкриваються потенціалчутливі натрієві канали через них в клітину входять іони N збільшення ступеню деполяризації під катодом. Деполяризація під катодом що повязана з відкриттям натрієвих каналів та з входом іонів N в клітину має назву локальної відповіді ЛВ. Таким чином при дії на...
84597. Механізми проведення збудження по нервових волокнам 46.51 KB
  Швидкість збільшення сили відповідає швидкості піку ПД майже відповідає швидкості збільшення сили при дії прямокутних імпульсів електричного струму набагато вища порогу. Отже на збуджену ділянку мембрани нервового волокна діє катодний електричний струм сила час дії та швидкість збільшення сили якого вищі порогу цей струм викличе деполяризацію мембрани до Екр викличе ПД на мембрані незбудженої ділянки. Ці струми в ділянці незбуджених перехватів мають вихідний напрямок; їх сила амплітуда ПД тривалість тривалість ПД швидкість...