Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

7.12.3. Перевантаження операції індексування масиву

У С++ можна перевантажувати оператор індексування масиву. Розглянемо кілька прикладів.

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

class MyArray {

private:

int v0,v1,v2;

public:

MyArray(int_v0,int_v1,int_v2)

{v0=_v0;

v1=_v1;

v2=_v2;}

int GetVal(unsigned i);

int operator[ ](unsigned i);

};

main()

{MyArray pa(10,20,30);

for(int i=0,i<=2 i++);

cout<<"pa["<<i<<]="<<pa[i];

}

int MyArray::GetVal(unsigned i)

{switch(i){

case 0:return v0;

case 1:return v1;

case 2:return v2;

default:return -1;}}

int MyArray::operator[](unsigned i)

{return GetVal(i);}

Бачимо, що у цьому ілюстративному прикладі перевантажується операція індексування масиву так, що її результатом є значення полів v0, v1, v2 чи -1 залежно від значення цілого аргументу операції. Після відповідного перевантаження можемо у main-функції записати

MyArray ekz(1,2,3);

cout<<ekz[1];

В ekz[1] здійснюється перевантаження операції індексування. У результаті буде надруковане значення поля v1 – число 2. Вираз ekz[1] еквівалентний ekz.GetVal(1).

У цьому прикладі індексами виступають цілі числа.

Перевантажимо оператор індексування масиву, щоб аргументом були значення типу char.

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

struct vidnoshennia{

char symvol;

Int znach;

};

class assoc{

public:

vidnoshennia*vec;

int max;

int free;

assoc(int);

int & operator[](char);

};

assoc::assoc(int i)

{max=i;

vec=new vidnoshennia[i];

free=0;

}

int& assoc::operator[ ](char p)

{

for(vidnoshennia*pp=vec;pp<&vec[max];pp++)

if(pp->symvol==p)return pp->znach;

vec[free].symvol=p;

return vec[free++].znach;

}

main()

{

int i=0;

char c;

assoc mas(10);

while(cin>>c)mas[c]=i++;

for(i=0;i<10;i++)

cout<<"symv="<<mas.vec[i].symvol<<"\ znach="<<mas[mas.vec[i].symvol]<<"\n";

}

У цьому прикладі перевантажується операція індексування масиву так, що індексом може виступати символьна змінна, а результатом операції є ціле число. Це дозволяє використати в програмі конструкції вигляду mas[c] та mas[mas.vec[i].symvol]. Таким способом ми будуємо відображення множини символів на множину цілих чисел. Причому операція перевантажується так, що повертається посилання на відповідне числове поле структури. Такий прийом дозволяє використовувати перевантажену операцію індексування одночасно й для ініціалізації числового поля у випадку, коли елемента з відповідним символьним індексом у масиві структур vec немає.

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

7.12.4. Перевантаження операції виклику функції

Перевантаження операції виклику минтаксично реалізується таким чином:

<тип>operator()(параметри)

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

class FuncClass {

int x;

public: