67280

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

Лекция

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

На додаток до традиційних перевантажених операторів мова програмування C++ дає змогу перевантажувати і оператор індексації елементів масиву "[]". У мові програмування C++ (з погляду механізму перевантаження) оператор "[]" вважається бінарним.

Украинкский

2014-09-06

49 KB

1 чел.

Лекція № 12

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

   На додаток до традиційних перевантажених операторів мова програмування C++ дає змогу перевантажувати і оператор індексації елементів масиву "[]". У мові програмування C++ (з погляду механізму перевантаження) оператор "[]" вважається бінарним. Його можна перевантажувати тільки для класу і тільки з використанням функції-члена класу. Ось як виглядає загальний формат операторної функції-члена класу operator[]().

тип ім'я_класу::operator[](int індекс)

{

//...

}

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

    Припустимо, нехай створено об'єкт ObjA, тоді вираз ObjA[3] перетвориться в такий виклик операторної функції operator[]():

ObjA.operator[](3);

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

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

Приклад1.  Демонстрація механізму перевантаження оператора індексації елементів

                   масиву "[]"

const int size = 3;

class aClass

{

int aMas[size];

public:

aClass() { for(int i=0; i<size; i++) aMas[i] = i*i; }

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

};

void main()

{

aClass ObjA;

cout << "aMas[2]= " << ObjA[2] << endl;                   // Відображає число 4

cout << "Znachennja elementiv mas <A>:" << endl;

for(int i=0; i<3; i++)

 cout << "aMas[" << i << "]= " << ObjA[i] << endl;

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

a[2]= 4

Значення елементів масиву <A>:

a[0]= 0

a[1]= 1

a[2]= 4

 

   Ініціалізація масиву aMas за допомогою конструктора (у цій і наступній програмах) здійснюється тільки з ілюстративною метою. У цьому коді програми функція operator[]() спочатку повертає значення 3-го елемента масиву aMas. Таким чином, вираз ObjA[2] повертає число 4, яке відображається настановою cout. Потім у иклі виводяться усі елементи масиву.

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

Приклад2.  Демонстрація механізму перевантаження оператора індексації елементів

                   масиву "[]" як зліва, так і праворуч від оператора присвоєння

const int size = 3;

 

class aClass

{

 int aMas[size];

public:

aClass() { for(int i=0; i<size; i++) aMas[i] = i*i; }

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

};

 

int main()

{

  aClass ObjA;

  cout << "Znachennja elementiv mas <A>:" << endl;

  for(int i=0; i<3; i++)

 cout << "aMas[" << i << "]= " << ObjA[i] << endl;

 

  ObjA[2] = 25;       // Оператор "[]" знаходиться зліва від оператора

                            присвоєння "=".

 cout << endl << "aMas[2]= " << ObjA[2]; // Тепер відображається число 25.

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Значення елементів масиву <A>:

a[0]= 0

a[1]= 1

a[2]= 4

 

a[2]= 25

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

    Одна з наявних переваг перевантаження оператора індексації елементів масиву "[]" полягає у тому, що за допомогою нього ми можемо забезпечити реалізацію безпечної індексації елементів масиву. Як уже зазначалося вище, у мові програмування C++ можливий вихід за межі масиву у процесі виконання програми без відповідного повідомлення (тобто без генерування повідомлення про динамічну помилку). Але,  якщо  створити  клас,  який містить масив,  і надати  доступ  до цього масиву тільки через перевантажений оператор індексації елементів масиву "[]", то в процесі виконання програми можливе перехоплення індексу, значення якого вийшло  за  дозволені  межі.  Наприклад,  наведений  нижче  код  програми (в  основу якої покладений програмний код попередньої) оснащена  засобом контролю потрапляння індексу масиву в допустимий інтервал його перебування.

Приклад3.  Демонстрація прикладу організації безпечного масиву

const int size = 3;

 

class aClass

{  

 int aMas[size];

public:

aClass() { for(int i=0; i<size; i++) aMas[i] = i*i; }

 int &operator[](int i);

};

 

  // Забезпечення контролю потрапляння індексу масиву

  // в допустимий інтервал його перебування.

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

{

 if(i<0 || i> size-1)

{

 cout << endl << "Znachennja indeksy " << i <<

            " vuhodut za me*i dopystumogo intervaly" << endl;

 //getch(); exit(1);

}

 return aMas[i];

}

 

void main()

{

aClass ObjA;

cout << "Znachennja elementiv mas <A>:" << endl;

 for(int i=0; i<3; i++)

 cout << "aMas[" << i << "]= " << ObjA[i] << endl;

ObjA[2] = 25;           // Оператор "[]" знаходиться в лівій частині.

cout << endl << "aMas[2]= " << ObjA[2];   // Відображається число 25.

ObjA[3] = 44;      // Виникає помилка тривалості виконання, оскільки

             // значення індексу 3 виходить за межі допустимого інтервалу.

}

   Внаслідок виконання ця програма відображає на екрані такі результати:

Значення елементів масиву <A>:

a[0]= 0

a[1]= 1

a[2]= 4

 

a[2]= 25

Значення індексу 3 виходить за межі масиву.

   У процесі виконання настанови

ObjA[3] = 44;

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


 

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

32724. Тепловые явления при низких температурах. Третье начало термодинамики 40.5 KB
  Расчет абсолютной энтропии Рассчитаем изменение энтропии некоторой системы при нагревании её от абсолютного нуля до температуры T при постоянном давлении. При нагревании вещества возможен его переход в жидкое и затем в газообразное состояние; для фазовых переходов происходящих в изобарноизотермических условиях изменение энтропии равно приведенной теплоте фазового перехода: I.65 Таким образом нагревание вещества без фазовых переходов сопровождается непрерывным ростом энтропии; при фазовом переходе происходит...
32725. Понятие фазы. Фазовые переходы 1 и 2 рода. Фазовые диаграммы. Тройная точка 57 KB
  Понятие фазы. В однокомпонентной системе разные фазы могут быть представлены различными агрегатными состояниями или разными полиморфными модификациями вещества. В многокомпонентной системе фазы могут иметь различный состав и структуру. Основные понятия Газ всегда состоит из одной фазы жидкость может состоять из нескольких жидких фаз разного состава Ликвация жидкостная несмешиваемость но двух разных жидкостей одного состава в равновесии сосуществовать не может.
32726. Материальная точка. Абсолютно твёрдое тело. Система отсчёта 27.5 KB
  Система отсчёта. Системы отсчёта. Для определения координат материальной точки следует прежде всего выбрать тело отсчёта и связать с ним систему координат. Для определения положения материальной точки в любой момент времени необходимо также задать начало отсчёта времени.
32727. Кинематика точки. Путь. Перемещение. Скорость и ускорение. Их проекции на координатные оси. Вычисление пройденного пути. Средние значения 28.5 KB
  Скорость и ускорение. Скорость векторная физическая величина характеризующая быстроту перемещения тела численно равная отношению перемещения за малый промежуток времени к величине этого промежутка. Промежуток времени считается достаточно малым если скорость при неравномерном движении в течение этого промежутка не менялась. Измеряют скорость спидометром.
32728. Скорость и ускорение при криволинейном движении. Тангенциальное и нормальное ускорения 37 KB
  Криволинейное движение с постоянным ускорением всегда происходит в той плоскости в которой находятся векторы ускорения и начальные скорости точки. В случае криволинейного движения с постоянным ускорением в плоскости xOy проекции vxи vy ее скорости на оси Ox и Oy и координаты x и y точки в любой момент времени t определяется по формулам vx=v0xxt x=x0v0xtxtxt2 2; vy=v0yyt y=y0v0ytyt2 2 Частным случаем криволинейного движения является движение по окружности. Движение по окружности даже равномерное всегда есть движение...
32729. Кинематика твёрдого тела. Вращение вокруг неподвижной оси. Угловые скорость и ускорения. Связь между угловыми и линейными скоростями и ускорениями 39 KB
  Кинематика твёрдого тела. Движение тела может быть как поступательным так и вращательным. При поступательном движении все точки твердого тела за один и тот же промежуток времени совершают равные по величине и направлению перемещения. Следовательно скорости и ускорения всех точек тела в любой момент времени также одинаковы.
32730. Границы применимости ньютоновской механики. Первый закон Ньютона 28.5 KB
  Первый закон Ньютона. Вследствие развития физики в начале XX века определилась область применения классической механики: ее законы выполняются для движений скорость которых много меньше скорости света. Вообще законы классической механики Ньютона справедливы для случая инерциальных систем отсчета. При ускоренном движении неинерциальной системы координат относительно инерциальной системы первый закон Ньютона закон инерции в этой системе не имеет места свободные тела в ней будут с течением времени менять свою скорость движения.
32731. Масса и импульс. Второй закон Ньютона как уравнение движения 37.5 KB
  Масса скал. тела масса величина аддитивная т. масса системы рана сумме масс материальных тел входящих в состав этой системы при любых воздействиях выполняется закон сохранения массы: суммарная масса взаимодействующих тел до взаимодействия и после равны между собой. инерции точка в которой может считаться масса всего тела при поступательном движении данного тела.
32732. Третий закон Ньютона. Центр масс. Уравнение движения центра масс 30.5 KB
  Центр масс. Уравнение движения центра масс. Сам закон: Тела действуют друг на друга с силами имеющими одинаковую природу направленными вдоль одной и той же прямой равными по модулю и противоположными по направлению: Центр масс это геометрическая точка характеризующая движение тела или системы частиц как целого. Определение Положение центра масс центра инерции в классической механике определяется следующим образом: где радиусвектор центра масс радиусвектор iй точки системы масса iй точки.