68950

Перевантаження операторів [], ()

Лекция

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

Ці оператори також можна перенавантажувати, що породжує масу цікавих можливостей. На перевантаження цих операторів розповсюджується одне загальне обмеження: вони повинні бути нестатичними функціями-членами. Дружні функції застосовувати не можна.

Украинкский

2014-09-27

49.5 KB

1 чел.

Лекція № 12

Тема: Перевантаження операторів [], ()

План

1. Перевантаження оператора "[]"

2. Перевантаження оператор "()"

Перевантаження деяких спеціальних операторів

У мові C++ існують оператори індексування елементів масиву "[]", виклику функції "()" і доступу до члена класу "->". Ці оператори також можна перенавантажувати, що породжує масу цікавих можливостей.

На перевантаження цих операторів розповсюджується одне загальне обмеження: вони повинні бути нестатичними функціями-членами. Дружні функції застосовувати не можна.

Перевантаження оператора"[]"

При перевантаженні оператор "[]" вважається бінарним. Отже, він повинен мати такий вигляд:

тип имя_класу: : operator [] (int i) {

// ...

}

З технічної точки зору параметр не зобов'язаний мати типу int, проте функція operator [] () зазвичай застосовується для індексування елементів масиву, тому найчастіше використовують саме цілочисельний параметр.

Допустимо, що об'єкт називається о. Тоді вираз

o[3]

 перетвориться в наступний виклик функції operator [] ():

o.operator[](3)

Інакше кажучи, значення виразу, з квадратними дужками, передається функції operator[] () як явний параметр. Покажчик this посилається на об'єкт о, який генерує виклик функції.

У наступній програмі клас atype містить масив, що складається з трьох елементів. Його конструктор ініціалізував кожен елемент масиву окремим значенням. Перевантажена операторна функція operator () [] повертає значення елементу масиву по заданому індексу.

#include <iostream>

using namespace std;

class atype {

int а[3];

public:

atype(int i, int j, int до) { а[0] = i; а[l] = j; а[2] = k; }

int operator[](int i) { return а[i]; } };

int main() {

atype ob(l, 2, 3);

cout « ob[l]; // Виводить на екран число 2

return 0;

}

Функцію operator () [] можна визначити так, щоб оператор "[]" був допустимим і в лівій, і в правій частині оператора привласнення. Для цього потрібно, щоб функція operator [] () повертала посилання. Продемонструємо це за допомогою наступної програми.

#include <iostream>

using namespace std;

class atype {

int а[3];

public:

atype(int i, int j, int до) { а[0]= i; atl] = j; а[2]= k; }

int &operator[](int i) { return а[i]; } };

int main() {

atype ob(l, 2, 3);

cout « ob[l]; // Виводить на екран число 2 cout « " ";

ob[l]= 25; // Оператор [] стоїть зліва

cout « ob[l]; // Тепер на екран виводиться число 25

return 0;

}

Оскільки тепер операторна функція operator [] () повертає посилання на елемент масиву з індексом i, її можна використовувати в лівій частині оператора привласнення для модифікації елементів масиву. (Зрозуміло, оператор " [] " як і раніше можна використовувати в правій частині оператора привласнення.)

Перевантаження оператора "[]" дозволяє забезпечити контроль за виходом індексу масиву за межі допустимого діапазону, який за умовчанням не передбачений в мові C++. Створивши клас, що містить масив, і передбачивши Перевантаженого оператора "[]", можна перехопити виникаючу виняткову ситуацію. Розглянемо приклад, в якому програма передбачає перевірку діапазону індексів масиву.

// Приклад безпечного масиву.

#include <iostream>

#include <cstdlib>

using namespace std;

class atype {

int а[3];

public:

atype(int i, int j, int до) { а[0]= i; а[l]= j; а[2]= до; }

int &operator[](int i); };

// Перевірка діапазону зміни індексу для класу atype.

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

{

if(i<0 || i> 2)

{

cout « "Вихід за межі допустимого диапазона\ п"; exit(l);

}

return а[i];

}

int main() {

atype ob(l, 2, 3);

cout « ob[l]; // Виводить на екран число 2 cout << " ";

ob[l]=25; // Оператор [] зліва

cout « ob[l]; // Виводить на екран число 25

ob[3] = 44; // Генерується помилка, значення 3

// лежить поза допустимим діапазоном

return 0;

}

При виконанні оператора

Оb[3] = 44;

функція operator[]() перехоплює виниклу виняткову ситуацію і припиняє виконання програми. (На практиці виконання програми зазвичай не припиняється, а замість цього викликається обробник виняткової ситуації, пов'язаної з виходом індексу за межі допустимого діапазону.)

Перевантаження оператора"()"

При перевантаженні оператора "()" створюється операторна функція, якою можна передавати довільну кількість параметрів. При цьому новий спосіб виклику функції насправді не створюється. Розглянемо приклад. Допустимо, що оператор виклику функції Перевантажений в деякому класі таким чином:

double operator()(int а, float f, char *s) ;

Крім того, припустимо, що змінна o є об'єктом цього класу. Тоді оператор

О(10, 23.34, "Привіт");

перетвориться в наступний виклик операторної функції operator ():

О.operator()(10, 23.34, "Привіт");

Як правило, при перевантаженні оператора "()" визначаються параметри, передавані функції. При виклику функції ці параметри копіюються і привласнюються відповідним аргументам. Як завжди, покажчик this посилається на об'єкт, що генерує виклик операторної функції (у даному прикладі на об'єкт про).

Розглянемо приклад Перевантаженого оператора "()" в класі loс. Він привласнює значення два своїх аргументів членам об'єкту класу 1ос, в яких зберігається значення широти і довготи.

#include <iostream>

using namespace std;

class loc {

int longitude, latitude;

public: loc() {

loc(int lg, int It) { longitude = lg; latitude = It; }

void show() {

cout << longitude « " " ;

cout « latitude « "\n"; }

loc operator+(loc op2);

loc operator()(int i, int j);

};

// Перевантажений оператор ( ) для класу loc.

loc loc::operator()(int i, int j)

{

longitude = i;

latitude = j;

return *this;

}

// Перевантажений оператор + для класу loc.

loc loc::operator+(loc op2)

{

lос temp;

temp.longitude = op2.longitude + longitude;

temp.latitude = op2.latitude + latitude;

return temp;

}

int main() {

loc ob1(10, 20), ob2(l, 1);

ob1.show();

ob1(7, 8); // Оператор застосовується самостійно

ob1.show();

ob1 = ob2 + ob1(10, 10);

// Оператора можна використовувати усередині виразів

ob1.show();

return 0;

}

Пам'ятайте, що, перенавантажуючи оператора "()", ви можете використовувати будь-який тип параметрів і будь-який тип повертаного значення. Ці типи можна вибирати залежно від конкретного застосування. Крім того, можна передбачати значення аргументів за умовчанням.


 

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

81424. Доменная структура и её роль в функционировании белков. Яды и лекарства как ингибиторы белков 106.19 KB
  Яды и лекарства как ингибиторы белков. Некоторые яды попадая в организм человека прочно связываются с определёнными белками ингибируют их и тем самым вызывают нарушения биологических функций. Так лекарства назначаемые в дозах больших чем терапевтические могут действовать как яды т. вызывать серьёзные нарушения обмена веществ и функций организма а яды в микродозах часто используют как лекарственные препараты.
81425. Четвертичная структура белков. Особенности строения и функционирования олигомерных белков на примере гемсодержащего белка - гемоглобина 104.92 KB
  Особенности строения и функционирования олигомерных белков на примере гемсодержащего белка гемоглобина. В частности молекула гемоглобина состоит из двух одинаковых α и двух βполипептидных цепей т. Молекула гемоглобина содержит четыре полипептидные цепи каждая из которых окружает группу гема пигмента придающего крови ее характерный красный цвет. Простетическая группа нековалентно связана с гидрофобной впадиной молекулы гемоглобина.
81426. Лабильность пространственной структуры белков и их денатурация. Факторы, вызывающие денатурацию 100.13 KB
  Под лабильностью пространственной структуры белка понимают способность структуры белковой молекулы претерпевать конформационные изменения под действием различных физикохимических факторов. Под денатурацией следует понимать нарушение общего плана уникальной структуры нативной молекулы белка преимущественно ее третичной структуры приводящее к потере характерных для нее свойств растворимость электрофоретическая подвижность биологическая активность и т. При непродолжительном действии и быстром удалении денатурирующих агентов возможна...
81427. Шапероны - класс белков, защищающий другие белки от денатурации в условиях клетки и облегчающий формирование их нативной конформации 105.78 KB
  Шаперо́ны (англ. chaperones) — класс белков, главная функция которых состоит в восстановлении правильной третичной структуры повреждённых белков, а также образование и диссоциация белковых комплексов. Термин «молекулярный шаперон» впервые был использован в работе Ласкей и других при описании ядерного белка нуклеоплазмина
81428. Многообразие белков. Глобулярные и фибриллярные белки, простые и сложные. Классификация белков по их биологическим функциям и по семействам: (сериновые протеазы, иммуноглобулины) 106.76 KB
  Глобулярные и фибриллярные белки простые и сложные. Так белки можно классифицировать: по форме молекул глобулярные или фибриллярные; по молекулярной массе низкомолекулярные высокомолекулярные и др.; по химическому строению наличие или отсутствие небелковой части; по выполняемым функциям транспортные защитные структурные белки и др.; по локализации в организме белки крови печени сердца и др.
81429. Иммуноглобулины, особенности строения, избирательность взаимодействия с антигеном. Многообразие антигенсвязывающих участков Н- и L-цепей. Классы иммуноглобулинов, особенности строения и функционирования 108.05 KB
  Домены тяжёлых цепей IgG имеют гомологичное строение с доменами лёгких цепей. Специфичность пути разрушения комплекса антигенантитело зависит от класса антител которых существует 5 типов: Ig IgD IgE IgG IgM. Созревающие Влимфоциты синтезируют мономерные бивалентные молекулы IgM по структуре похожие на рассматриваемые выше IgG которые встраиваются в плазматическую мембрану клеток и играют роль первых антигенраспознающих рецепторов. В количественном отношении IgG доминируют в крови и составляют около 75 от общего количества этих...
81430. Физико-химические свойства белков. Молекулярный вес, размеры и форма, растворимость, ионизация, гидратация 103.82 KB
  Молекулярный вес размеры и форма растворимость ионизация гидратация Индивидуальные белки различаются по своим физикохимическим свойствам: форме молекул молекулярной массе суммарному заряду молекулы соотношению полярных и неполярных групп на поверхности нативной молекулы белка растворимости белков а также степени устойчивости к воздействию денатурирующих агентов. Различия белков по молекулярной массе. Молекулярная масса белка зависит от количества аминокислотных остатков в полипептидной цепи а для олигомерных белков и от...
81431. Методы выделения индивидуальных белков: осаждение солями и органическими растворителями, гель-фильтрация, электрофорез, ионообменная и аффинная хроматография 104.42 KB
  Метод выделения белков основанный на различиях в их растворимости при разной концентрации соли в растворе. Соли щелочных и щёлочноземельных металлов вызывают обратимое осаждение белков т. Чаще всего для разделения белков методом высаливания используют разные концентрации солей сульфата аммония NH42SO4.
81432. Методы количественного измерения белков. Индивидуальные особенности белкового состава органов. Изменения белкового состава органов при онтогенезе и болезнях 110.81 KB
  Индивидуальные особенности белкового состава органов. Изменения белкового состава органов при онтогенезе и болезнях. Для определения количества белка в образце используется ряд методик: Биуретовый метод один из колориметрических методов количественного определения белков в растворе.