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;

}

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


 

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

38229. Теория бухгалтерского учета. Понятие об учете, виды учета, их взаимосвязь 487 KB
  Понятие об учете виды учета их взаимосвязь. Предмет и объекты бухгалтерского учета. Метод бухгалтерского учета. Обобщение данных текущего бухгалтерского учета.
38230. Глобализация конкуренции и конкурентные преимущества стран 39.08 KB
  Один из основных детерминантов национального конкурентного преимущества в какойлибо отрасли это спрос на внутреннем рынке на товары или услуги предлагаемые этой отраслью. Взаимосвязанные отрасли Для многих отраслей самым главным ресурсом остается наличие связанных и вспомогательных отраслей. Стратегия структура и соперничество фирм Еще одним важным детерминантом определяющим конкурентоспособность отрасли является тот факт что фирма создается организуется и управляется в зависимости от характера конкуренции на внутреннем рынке.
38231. Маркетинг. Ответы на экзаменационные вопросы 111 KB
  Сущность и эволюция маркетинга. Изучение маркетинга позволяет сделать максимально правильный выбор целевого рынка. Самой главной целью маркетинга является: поставить производимый товар или услугу вне конкуренции. Без маркетинга работа предприятия практически невозможна.
38232. Теория маркетинга. Сбытовая политика предприятия 394.5 KB
  Рынок – совокупность существующих и потенциальных покупателей товара. Анализ маркетинговой среды: определение ёмкости рынка прогнозирование величины спроса проведение маркетинговых исследований выбор целевого сегмента и определение его профиля позиционирование товара и фирмы в целом. Разработка товарной политики: разработка новых товаров управление товарным ассортиментом разработка дизайна и качественных характеристик товара разработка упаковки и товарной марки определение комплекса дополнительных услуг. Применяется когда реальные...
38233. Организация маркетинга на предприятии, организационный механизм 62.5 KB
  Организационный механизм – маркетинговое подразделение предприятия а управленческий – разрабатываемый им план маркетинга который является составной частью бизнес-плана. Функциональная служба маркетинга включает в себя отделы где сотрудники специализируются на выполнении одной определённой функции маркетинга. Товарная служба маркетинга характеризуется те что служба состоит из отдела которая осуществляет деятельность по определённому товару группе товаров.
38234. Анализ маркетинговой среды 109.5 KB
  Видовые конкуренты – это прочие разновидности того же товара способные удовлетворить конкретное желание покупателя. Конкуренты марки – это разные марки одного и того же товара способные удовлетворить его желание. В данном случае разновидностями товара будут трех пяти и десятискоростные велосипеды. расположите по определённым характеристикам характеристики товара при его покупке.
38235. Товарная политика предприятия 82 KB
  Товары в зависимости от цели покупки и категории покупателя разделяют на потребительские и промышленные. Потребительские товары – товары которые покупаются физическими лицами для личного некоммерческого потребления. Товары произведенотехнического назначения промышленные – товары которые приобретаются предприятиями и организациями для промышленного потребления т. Потребительские товары делятся на группы виды в зависимости от покупательского поведения при их покупке: 1.
38236. Экономическая теория, ответы к экзамену 424.5 KB
  Можно сказать что экономическая наука явилась теоретическим отражением сути капитализма противоречивых явлений жизни людей разделенных на классы когда торжество идей свободы равенства и братства сочеталось с бременем наемного труда. В начальный период возникновения рынка они преимущественно приравнивали друг к другу результаты своего труда продукты созданные их руками или непосредственно полученные у природы и по праву им принадлежащие. В этих условиях основой соизмерения определяющей величину стоимости ценности этих вещей...