Преклапање оператора [] – индексирање

За преклапање оператора [] може се користити само метода дате класе, али заједничка метода (static) не сме, и не смеју бити пријатељске функције!
Оператор [] је бинарни оператор којем одговара функција operator[](). Приступ елементу низа niz[ind] је еквивалент изразу niz.operator[](ind) за објекат niz. Преклапање оператора [] у некој класи омогућава корисћење објеката у изразима облика o[i].
Код стандардног индексирања индексни израз мора бити целобројног типа. Код преклопљеног оператора [] индексни израз може бити произвољног типа.

Могуће примене:
– класа чији су објекти низови са задатим границама индекса: функција индексирања може да проверава границе;
– асоцијативни приступ компонентама низа – елементима се не приступа на бази редног броја (индекса) него на бази неке вредности (кључа).
Често је потребно да израз са оператором [] може да буде први операнд операције доделе (нпр. o[i]=izraz;). Тада тип вредности операторске функције operator[]() треба да буде референца на објекат. Да би израз са преклопљеним оператором [] могао да се користи у изразима облика o[ind]=izraz, тип вредности операторске функције operator[] () мора бити упућивач на објекте посматране класе.

Израз са преклопљеним оператором [] није индексирање, само тако изгледа. Операторска функција делује само на објекат своје класе, а не на низ објеката. Због тога израз o[i] не може да се замени изразом *(o+i), као што је код низова могуће уместо израза niz[i] користити израз *(niz+i).

За преклапање оператора индексирања могу да се користе само нестатичке методе.

Пример: Написати програм у коме је дефинисан низ са границама индекса од -5 до 5.

#include<cmath>
 #include<iostream>
 #include<cstdlib>
 using namespace std;
 class Niz
 {
      int poc,kraj;
      double *a;
      void kopiraj(const Niz &);
 public:
      Niz(int min,int max)
      {
           if(min>max)exit(1);
           a=new double [(kraj=max)-(poc=min)+1];
      }
      Niz(const Niz &niz){kopiraj(niz);}
      ~Niz(){delete[]a;}
      Niz & operator= (const Niz &niz)
      {
          if(this!=&niz){delete[]a;kopiraj(niz);}
           return *this;
      }
      double & operator[](int i)const
      {
           if(i<poc||i>kraj)exit(2);
           return a[i-poc];
      }
 };
 void Niz::kopiraj(const Niz &niz)
 {
      a=new double[(kraj=niz.kraj)-(poc=niz.poc)+1];
      for(int i=0;i<kraj-poc+1;i++)a[i]=niz.a[i];
 }
 int main()
 {
      Niz niz(-5,5);
      for(int i=-5;i<=5;i++){niz[i]=i;cout<<niz[i]<<'\t';}cout<<endl;
 }

Не постоји подразумевани конструктор. Ако је при стварању новог низа почетни индекс већи од крајњег индекса програм се прекида. За копирање изворишног низа конструктор копије и преклопљени оператор = користе приватну методу kopiraj, која је дефинисана изван класе (зато је неопходан оператор за разрешење досега :: )
За функцију operator[] тип резултата је упућивач на податке типа елемената низа. Ако је индекс i изван дозвољеног опсега програм се прекида. Ако је индекс у дозвољеном опсегу пресликава се у опсег од 0 до kraj-poc (i-poc) тако да се онда стандардним индексирањем дохвата одговарајући елеменат низа.
*(niz+4)=4 //овакав израз није дозвољен јер за преклопљени оператор [] не важи адресна аритметика!

делови текста преузети са: Preklapanje operatora

Advertisements

Оставите одговор

Попуните детаље испод или притисните на иконицу да бисте се пријавили:

WordPress.com лого

Коментаришет користећи свој WordPress.com налог. Одјавите се / Промени )

Слика на Твитеру

Коментаришет користећи свој Twitter налог. Одјавите се / Промени )

Фејсбукова фотографија

Коментаришет користећи свој Facebook налог. Одјавите се / Промени )

Google+ photo

Коментаришет користећи свој Google+ налог. Одјавите се / Промени )

Повезивање са %s