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;

}


 

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

84685. Структура Посольства, распределение обязанностей, штатное расписание 13.41 KB
  Структура Посольства распределение обязанностей штатное расписание. Посол представляет РФ непосредственно руководит работой Посольства несёт персональную ответственность за выполнение возложенных на Посольство задач и осуществление им функций определяет в соответствии с нормативными актами МИДа России структуру Посольства распределяет должностные обязанности между его сотрудниками. Сотрудников посольства. Обеспечение безопасности посольства его сотрудников и членов их семей организация защиты государственной и иной охраняемой законом...
84686. Роль иностранного языка в работе дипломата 12.06 KB
  Роль иностранного языка в работе дипломата. Роль иностранного языка в работе чрезвычайно важна. Профессиональное владение иностранными языками может пригодиться дипломату во многих сферах его дипломатической деятельности. Знание в совершенстве языка страны пребывания значительно расширяет количество источников информации печатные издания на иностранном языке интернетресурсы телевидение радио и т.
84687. МГИМО: история, структура, кадровая база МИД России 15.87 KB
  МГИМО: история структура кадровая база МИД России. МГИМО является одним из старейших университетских центров страны по подготовке специалистов международного профиля. Первый набор в МГИМО составил 200 студентов. С 1946 года на учебу в МГИМО стали направляться студенты из зарубежных стран.
84688. Статус профессиональной дипслужбы во внешнеполитической системе, дипломаты и политическое руководство 13.63 KB
  Служба в аппарате внешнеполитического ведомства это особая разновидность федеральной государственной службы Российской Федерации. Это профессиональное осуществление целей и функций внешней политики России посредством исполнения государственных должностей федеральной государственной службы утвержденных в: центральном аппарате МИД РФ диппредставительствах и консульских учреждениях за рубежом представительствах при международных организациях представительствах МИД на территории РФ на отдельных государственных должностях госслужбы в...
84689. Порядок приема в МИД и требования, предъявляемые к выпускникам вузов, впервые поступающим на государственную службу 14.85 KB
  К дипломатической службе не относятся технические сотрудники. В России долгое время не было специального закона о дипломатической службе. Закон 79ФЗ о гражданской службе от 2004 года распространялся и на дипломатическую службы. В этих законах формулируются принципы государственной службы: равных доступ граждан к службе профессионализм и компетентность стабильность.
84690. Дипломатические ранги и порядок их присвоения 15.73 KB
  Присвоение дип рангов дип работникам производится в соответствии с установленными ФЗ Об основах гос службы РФ и иными нормативными правовыми актами РФ квалификационными требованиями к профессиональному образованию стажу и опыту работы по специальности знанию Конституции РФ Федеральных Законовнов применительно к исполнению своих должностных обязанностей а также с учетом срока пребывания в дип ранге результатов служебной деятельности и при наличии сертификата о соответствующем уровне владения иностранным языком. Присваиваются следующие...
84691. Порядок отбора кандидатов на замещение дипломатических должностей в загранучреждениях 17.24 KB
  Форма прохождения дипломатической службы в каждой стране своя; она определяется национальными особенностями и традициями этой страны а также материальными и кадровыми возможностями. Однако под влиянием глобализации происходит стандартизация дипломатической службы во всем мире. Это крайне ценимые качества на дипломатической службе. Главные требования которые предъявляются к лицам претендующим на должность дипломатической службы: сильная политологическая правовая и общегуманитарная подготовка классического образца воспитанность и хорошие...
84692. Прохождение службы в центральном аппарате МИДа и за рубежом. Ротация дипломатических кадров 14.15 KB
  Основные элементы системы прохождения дипслужбы можно представить следующим образом: А отбор на службу оценка претендентов с точки зрения их профессиональнокфалификационной психологической и духовнонравственной пригодности к работе в структурах МИД и загранучреждений РФ; Б процедура утверждения в должности замещение госдолжности дипслужбы; В профессиональная адаптация путём испытательного срока стажировок повышения квалификации и других мероприятий; Г оценка служебной деятельности формирование здоровых ценностных установок на...
84693. Основные черты современного дипломата 12.27 KB
  К числу важнейших для дипломата качеств относят: глубокое понимание целей задач и особенностей внешнеполитического курса России способность к стратегическому видению развития событий умение грамотно доходчиво и убедительно выражать свои мысли как в письменной так и в устной форме знание современных информационных технологий проницательность умение увидеть главное и определяющее в информационном потоке стрессоустойчивость способность определять приоритеты организованность ответственность обладание высоким общеобразовательным и...