Преклапање оператора ++ и —

Унарни оператори ++ и — су специфични по томе што имају и префиксни (++а) и постфиксни облик (а++).
За преклапање префиксних облика ових оператора користе се методе без параметара или глобалне функције са једним параметром.
За преклапање постфиксних облика ових оператора користе се методе са једним параметром типа int или глобалним функцијама са два параметра, од којих је први типа класе за коју се врши преклапање, а други је типа int. Једина сврха тог целобројног параметра је да обезбеди другачији прототип функције за преклапање постфиксног од префиксног облика ових оператора, па га не треба користити у телу функције.
Пример:

 class Kompl
 {
      float re,im;
 public:
      Kompl (float r, float i) {re=r;im=i;} // konstruktor
      Kompl & operator++() {++re;return *this;} // prefiksni oblik
      Kompl operator++(int) {Kompl z=*this;re++;return z;} // postfiksni oblik
      friend Kompl & operator-- (Кompl &z){--z.re;return z;} // prefiksni oblik
      friend Kompl operator-- (Kompl &z,int) {Kompl x=z;z.re--;return x;} // postfiksni oblik
 };

Преклапање оператора ++ дато је у облику метода, а преклапање оператора — дато је у облику пријатељских функција. То је урађено као илустрација, иначе се оба оператора и оба параметра реализују на исти начин!
За префиксне облике оба оператора вредност функције треба да је промењени операнд. Зато је тип функције дефинисан као упућивач, а промена реалног дела параметра (бочни ефекат) ради се директно на објекту над којим се позива операторска функција.
За постфиксни облик, вредност функције треба да је почетна вредност аргумента. Због тога се уводи локална променљива у којој се чува почетна вредност аргумента, затим се мења вредност параметра (бочни ефекат), а сачувана вредност се враћа као резултат функције.
Додатни параметар int није коришћен у функцији, служи само за дефинисање другачијег прототипа функције, зато и нема име.


Примери:

пример 1. – преклапање оператора ++ и — реализовано помоћу метода

#include <iostream>
 using namespace std;
 class Kompl
 {
      float re, im;
public:
     friend ostream & operator<< (ostream &dat, const Kompl &z)
     { return dat << "(" << z.re << "," << z.im << ")" ; } // preklapanje operatora <<
     Kompl (float r=0, float i=0) {re=r;im=i;} // konstruktor, moze biti i podrazumevani
     Kompl & operator++ () { ++re; return *this; }
     Kompl operator++ (int) { Kompl z=*this; re++; return z; }
     Kompl & operator-- () { --re; return *this; }
     Kompl operator-- (int) { Kompl z=*this; re--; return z; }
 };

пример 2: преклапање оператора ++ и — реализовано помоћу пријатељских функција

#include <iostream>
using namespace std;
class Kompl
{
     float re, im;
public:
     friend ostream & operator<< (ostream &dat, const Kompl &z)
     { return dat << "(" << z.re << "," << z.im << ")" ; }
     Kompl (float r=0, float i=0)  {re=r;im=i;} // konstruktor
     friend Kompl & operator++ (Kompl &z) { z.re++; return z; }
     friend Kompl operator++ (Kompl &z, int) { Kompl x=z; z.re++; return x; }
     friend Kompl & operator-- (Kompl &z) { z.re--; return z; }
     friend Kompl operator-- (Kompl &z, int) { Kompl x=z; z.re--; return x; }
};
Advertisements

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

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

WordPress.com лого

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

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

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

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

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

Google+ photo

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

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