89793

Перегрузка операций в классах

Лекция

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

Поскольку в С++ операции, рассматриваются как функции, то их можно переопределять так, что они будут работать не только с числами, а даже с графическими объектами, строками и вообще с чем угодно.

Русский

2015-05-13

62.03 KB

3 чел.

Перегрузка операций в классах

Определение (перегрузка) операций в классах

Поскольку в С++ операции, рассматриваются как функции, то их можно переопределять так, что они будут работать не только с числами, а даже с графическими объектами, строками и вообще с чем угодно. 

C++ позволяет распространить действие любой стандартной операции на новые типы данных, вводимые пользователем. Распространить операцию на новые типы данных позволяет механизм перегрузки стандартных операций. В С++ число операций ограничено стандартным набором.

Перегружаемые операции:

  •  Арифметические и логические операторы
  •  Операторы сравнения и равенства
  •  Операторы присваивания
  •  Битовые операторы
  •  Операторы ++ и -- в постфиксном и префиксном значениях
  •  Операторы индексации массива []
  •  Вызов функции ()
  •  Оператор доступа к члену через указатель на объект -> и обращения к члену через указатель на член ->*
  •  Операторы перенаправления ввода >> и вывода <<
  •  Операторы new и delete

Для распространения действия операции на новые пользовательские типы данных программист определяет специальную функцию, называемую «операция-функция»:

тип_возвращаемого_значения operator знак_операции (спецификация _параметров_операции-функции) {операторы_тела_операции-функции}

Чтобы явная связь с классом была определена, операция-функция: 

  •  может быть компонентом класса,
  •  определена в классе как дружественная, 
  •  у нее должен быть хотя бы один параметр типа класс (или ссылка на класс).

При переопределении операции действуют следующие ограничения: 

  •   С++ не различает префиксные и постфиксные версии операций ++ и --. 
  •   операция, которую вы хотите определить, уже должна существовать в языке. Например, вы не можете определить операцию #. 
  •   нельзя переопределить следующие операции:  .     .*     ::    ?:
  •   переопределенные операции сохраняют свое первоначальное старшинство. 

При вызове операции-функции используется обычный вид бинарных операций:

C=A+B;

или полная форма вызова:

C=operator + (A,B);

Любая стандартная бинарная операция @ может быть перегружена с помощью нестатической операции-функции, входящей в число компонентов класса с одним параметром:

T operator @ (T x)

Тогда вызов операции A @ B с объектами A и B класса T в качестве операндов интерпретируется как вызов функции:

A.operator@(B)

Если @ обозначает любую унарную операцию, то выражения x@ и @x можно интерпретировать либо как x.операция@(), либо как операция@(x). Если описаны обе формы, то компилятор попытается разрешить неоднозначность путем сравнения аргументов. Аналогично, переопределение бинарной операции @ в x@y может толковаться либо x.операция@(y), либо операция@(x,y), и если определены обе формы, то компилятору требуется анализировать аргументы. 

Пример #11. Класс clock

class clock{

public:

clock (unsigned long i);//конструктор

void print() const;//вывод по формату

void tick();//добавляет 1 секунду

clock operator++(){tick(); return *this;};

clock operator –(clock c){return (tot_secs-c.tot_secs);};

friend clock operator +(clock c1, clock c2) { return (c1.tot_secs+c2.tot_secs);};

friend clock operator *(unsigned long m, clock c) {return (m*c.tot_secs);};

friend clock operator *(clock c, unsigned long m) {return (m*c);};

private:

unsigned long tot_secs, secs, mins, hours, days;

};

inline clock::clock(unsigned long i)

{tot_secs=i; secs=tot_secs% 60;

mins=(tot_secs / 60) % 60;

hours=(tot_secs / 3600) % 24;

days= tot_secs / 86400;}

void clock::tick()

{ clock temp=clock(++tot_secs);

secs=temp.secs; mins=temp.mins;

hours=temp.hours; days=temp.days;}

void clock::print() const {

cout<<days<<“ д:”<<hours<<“ ч:” <<mins<<“  м:”<<secs<<“ с:”<< endl;}

int main()

{ clock::clock t1(59), t2(172799);

cout<<“начальное время”<<endl;

t1.print(); t2.print();

++t1; ++t2;

cout<<“время через секунду”<<endl;

t1.print(); t2.print();

return 0;

}

Пример #12. Массив

#include <iostream.h>

#include <assert.h>

class vect {

public:

explicit vect(int n=10);

//инициализация вектором vect (копирующий конструктор)

vect(const vect& v);

//инициализация массивом

vect(const int a[], int n);

~vect() {delete []p;}

int ub() const {return (size-1);}

int&  operator[] (int i);

vect& operator= (const vect& v);

vect operator+ (const vect& v);

private:

int* p; int size;

}

vect::vect(int n):size(n)

{ assert (n>0);

p=new int[size];

assert (p!=0);

}

vect::vect(const int a[], int n): size(n)

{   assert (n>0);

p=new int[size];

assert (p!=0);

for (int i=0; i<size; i++) p[i]=a[i];

}

vect::vect(const vect& v):size(v.size)

{ p=new int[size];

assert (p!=0);

for (int i=0; i<size; i++) p[i]=v.p[i];

}

int& vect::operator [] (int i)

//точно также можно определить оператор 

//индексирования (): int& vect::operator () (int i)

{ assert (i>=0 && i<size);

return p[i];

}

vect& vect::operator= (const vect& v)

{ if (this != &v)

{assert(v.size==size);

for (int i=0; i<size; ++i) p[i]=v.p[i];} return *this;}

vect vect::operator+ (const vect& v)

{ assert (v.size==size);int s=size;

vect sum(s);   

for (int i=0; i<s; ++i) sum.p[i]=p[i]+v.p[i];

return sum;

}

int main(){

vect A(3),B(3);

int i,b[5];

vect C(b,5), D(C);

for(i=0;i<3;i++){A[i]=i;} B=A;

for(i=0;i<3;i++){cout<<A[i]<<' ';} cout<<endl;

for(i=0;i<3;i++){cout<<B[i]<<' ';} cout<<endl;

A=A+B;

for(i=0;i<3;i++){cout<<A[i]<<' ';} cout<<endl;

return 0;

}

Пример #13. Перегруженные операторы ввода-вывода

class rational{//класс рациональных чисел

public:

rational (){}

~rational (){}

friend ostream& operator<< (ostream& out, rational x);

friend istream& operator>> (istream& in, rational& x);

private:

long a,q;

};

ostream& operator<<(ostream& out, rational x)

{return (out<<x.a<<“/”<<x.q<<‘\t’);};

istream& operator>> (istream& in, rational& x)

{return (in>>x.a>>x.q);};

int  main()

{

rational a,b;

cin>>a>>b;

cout<<a<<b;

return 0;

}

Пример #14. Операторы указателей

#include <iostream.h>

class triple{

public:

triple(int a, int b, int c)

{i=a; j=b; k=c;}

void print()

{cout<<“\ni=”<<i<<“, j=”<<j<<“, k=“<<k;}

private:

int i, j, k;

};

triple unauthor(0, 0, 0);

class t_ptr{

public:

t_ptr(bool f, triple* p)

{access=f; ptr=p;}

triple* operator->();

private:

bool access;

triple* ptr;

};

triple* t_ptr::operator->()

{

if (access) return (ptr);

else {cout<<

“\n Несанкционированный доступ”;

return &unauthor;}

}

int main()

{

triple a(1,2,3), b(4,5,6);

t_ptr ta(false, &a), tb(true, &b);

ta->print();//доступ запрещен

tb->print();//доступ предоставлен

return 0;

}


 

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

81529. Механизмы передачи гормональных сигналов в клетки 98.08 KB
  По механизму действия гормоны можно разделить на 2 группы. К первой группе относят гормоны взаимодействующие с мембранными рецепторами пептидные гормоны адреналин а также гормоны местного действия цитокины эйкозаноиды. Вторая группа включает гормоны взаимодействующие с внутриклеточными рецепторами.
81531. Строение, синтез и метаболизм иодтиронинов. Влияние на обмен веществ. Изменение метаболизма при гипо- и гипертиреозе. Причины и проявление эндемического зоба 160.08 KB
  Биосинтез йодтиронинов. Из цистерн ЭР Тиреоглобулин поступает в аппарат Гольджи включается в состав секреторных гранул и секретируется во внеклеточный коллоид где происходит йодирование остатков тирозина и образование йодтиронинов. Йодирование тиреоглобулина и образование йодтиронинов осуществляется в несколько этапов Транспорт йода в клетки щитовидной железы. Образование йодтиронинов.
81532. Регуляция энергетического метаболизма, роль инсулина и контринсулярных гормонов в обеспечении гомеостаза 107.55 KB
  Абсорбтивный период характеризуется временным повышением концентрации глюкозы аминокислот и жиров в плазме крови. Изменения метаболизма в печени в абсорбтивном периоде После приёма пищи печень становится главным потребителем глюкозы поступающей из пищеварительного тракта. Почти 60 из каждых 100 г глюкозы транспортируемой портальной системой задерживается в печени. Увеличение потребления печенью глюкозы не результат ускорения её транспорта в клетки транспорт глюкозы в клетки печени не стимулируется инсулином а следствие ускорения...
81533. Изменения метаболизма при сахарном диабете. Патогенез основных симптомов сахарного диабета 115.42 KB
  При недостаточности содержания инсулинавозникает заболевание которое носит название сахарный диабет: повышается концентрация глюкозы в крови гипергликемия появляется глюкоза в моче глюкозурия и уменьшается содержание гликогена в печени. При введении инсулина больным диабетом происходит коррекция метаболических сдвигов: нормализуется проницаемость мембранмышечных клеток для глюкозы восстанавливается соотношение между гликолизом и глюконеогенезом. В связи с этим при инсулярной недостаточности и сохранении или даже повышении...
81534. Патогенез поздних осложнений сахарного диабета (макро- и микроангиопатии, нефропатия, ретинопатия, катаракта). Диабетическая кома 108.17 KB
  Диабетическая кома. Диабетическая ретинопатия поражение сетчатки глаза в виде микроаневризм точечных и пятнистых кровоизлияний твёрдых экссудатов отёка образования новых сосудов. Диабетическая микро и макроангиопатия нарушение проницаемости сосудов повышение их ломкости склонность к тромбозам и развитию атеросклероза возникает рано поражаются преимущественно мелкие сосуды. Диабетическая полинейропатия чаще всего в виде двусторонней периферической нейропатии по типу перчаток и чулок начинающаяся в нижних частях конечностей.
81535. Регуляция водно-солевого обмена. Строение и функции альдостерона и вазопрессина 199.48 KB
  Основные гормоны участвующие в тонкой регуляции водносолевого баланса и действующие на дистальные извитые канальцы и собирательные трубочки почек: антидиуретический гормон АДГ альдостерон и предсердный натриуретический фактор ПНФ. Антидиуретический гормон Антидиуретический гормон АДГ или вазопрессин пептид с молекулярной массой около 1100 Д содержащий 9 аминокислот соединённых одним дисульфидным мостиком. АДГ синтезируется в нейронах гипоталамуса в виде предшественника препрогормона который поступает в аппарат Гольджи и...
81536. Система ренин-ангиотензин-альдостерон. Биохимические механизмы возникновения почечной гипертонии, отеков, дегидратации 105.02 KB
  Главным механизмом регуляции синтеза и секреции альдостерона служит система ренинангиотензин. Субстратом для ренина служит ангиотензиноген. Ангиотензиноген α2глобулин содержащий более чем 400 аминокислотных остатков.
81537. Роль гормонов в регуляции обмена кальция и фосфатов (паратгормон, кальцитонин). Причины и проявления гипо- и гиперпаратироидизма 106.8 KB
  Паратгормон Паратгормон ПТГ одноцепочечный полипептид состоящий из 84 аминокислотных остатков около 95 кД действие которого направлено на повышение концентрации ионов кальция и снижение концентрации фосфатов в плазме крови. Скорость распада гормона уменьшается при низкой концентрации ионов кальция и увеличивается если концентрация ионов кальция высока. Секреция ПТГ регулируется уровнем ионов кальция в плазме: гормон секретируется в ответ на снижение концентрации кальция в крови.