68950

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

Лекция

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

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

Украинкский

2014-09-27

49.5 KB

0 чел.

Лекція № 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;

}

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


 

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

23868. «Поучение» Владимира Мономаха 35 KB
  Владимир Мономах Великий Князь Киевский был сыном Всеволода Ярославича и византийской царевны.Основные черты Поучения:1 Требование соблюдения норм христианской морали быть кротким слушать старейших и покоряться им не обижать сирот2 Основная мысль Поучении князь должен беспрекословно подчиняться старейшему жить в мире с другими князьями не притеснять младших князей и бояр. Князь так же должен избегать ненужного кровопролития быть радушным хозяином не предаваться лени не увлекаться властьюНо Мономах не ограничивается...
23869. Слово о законе и благодати митрополита Иллариона 31.5 KB
  Автор Слова Иларион первый митрополит из русских поставленный на киевскую митрополию из священников в 1051 г.Тема Слова тема равноправности народов резко противостоящая средневековым теориям богоизбранничества лишь одного народа теориям вселенской империи или вселенской церкви.Трехчастная композиция Слова подчеркнутая в названии позволяет органически развить основную тему Слова прославление Русской земли ее кагана Владимира и князя Ярослава.Основной пафос Слова в систематизации в приведении в иерархическую цепь фактов вселенской...
23870. Особенности передачи сигналов по линиям связи 48 KB
  Сеть - это совокупность каких-либо линий, расположенных по определенной системе (Толковый словарь русского языка. Под редакцией проф. Д.Н. Ушакова). Применительно к радиотехнической специальности в качестве такой совокупности будем рассматривать линии связи.
23871. Историческая основа Слова 22 KB
  историческая основа СловаВ основе сюжета лежат действительные реальные события: поход на половцев князя Игоря Святославича. Согласно этой летописи Игорь выступил в поход 23 апреля 1185 года. В пути к ним присоединился и четвертый участник похода брат Игоря Всеволод князь Трубчевский.Затмение 1 мая 1185 года встревожило князей и участников похода: они увидели в нём недоброе предзнаменование но Игорь убедил своих соратников продолжить поход.
23872. Идейно-художественная концепция Слова 25.5 KB
  Идейнохудожественная концепция СловаАвтор слова превратил частный случай поражения русских в событие общерусского значения. Кто виноват:сами виноватыно есть разная степень виныполитические уроки слова Что делатьНа силу ответить силойнет. Жертвенная любовьособенно в образе Ярославныстановиться главной идей слова.Художественная природа слова своеобразна.
23873. Композиция и жанр Слова 27.5 KB
  Жанр СловаСлово как и ряд других памятников древнерусской литературы оказывается как бы вне её жанровой системы. Для русской литературы того времени было характерно существование двух жанровых систем: системы литературных жанров и системы жанров фольклора. Но обе эти системы не знали жанров которые могли бы воплотить в себе новые формы исторического и патриотического сознания. Система фольклорных жанров была для этого слишком архаичной а система лит.
23874. Жанр, композиция «Слова» 42 KB
  начало а содержание составляют помимо откликов на поход Игоря также припоминания о различных событиях произошедших за полтора предшествующих столетия. Автор излагает свои намерения противопоставляя их тому в каком роде стал бы восхвалять поход Игоря его предшественник Боян. слагающему песнь последнему походу Игоря необходимо придерживаться правды и петь свою песнь по былинам сего времени. Предстоит петь не славу походу Игоря а по нашим понятиям нечто вроде плача или даже антиславы.
23875. Образные системы слова 63.5 KB
  Образные системы слова Слово насыщено народной поэзией ее художественными образами. Лихачев отмечает: Автор €œСлова€ творит в формах народной поэзии потому что сам он близок к народу стоит на народной точке зрения. Народные образы €œСлова€ тесно связаны с его народными идеямиСозданию и восприятию этнографической картины способствуют деловая военная феодальная трудовая охотничья лексика описание воинских обычаев а также использование символики.многое в художественных образах €œСлова€ рождалось самой жизнью шло от разговорной...
23876. Задонщина: образная система 26.5 KB
  СОДЕРЖАНИЕ:Дмитрий ИвановичДонской и его брат Владимир Андреевич сидят на пиру с воеводами и оповещают всехчто Мамай зочет напасть на Русьпризыв к объединению народа.войка сходятсябьются с утра и до полудняочень много убито русских войноввсе жены плачутв тот же день на рождение святой Богородицы разгромили христианские полки татардалее бегство татарСлава Донского и его братаДонской просит посчитать погибшихмолитсяпросит прощения у мертвых и возвр в МосквуНет радости от победыпотери очень великиболь от победы заглушает...