Architektura C++ s důrazem na vývoj .NET prostředí 2.díl Operátory

Napsal O webu (») 2. 7. 2008 v kategorii Programování, přečteno: 1104×

Přiřazovací operátor

= != += *= /= %= >>= <<= ^= |=
Jednoduchý přiřazovací operátor se může přetěžovat pouze jako nestatická metoda objektového typu. Složené přiřazovací operátory lze přetěžovat i jako řadové funkce.

Binární operátory
+ - * / % > < >= <= == != && || & | ^ >> <<

V případě, že definujeme binární operátor jako samostatnou, řadovou funkci, musí mít dva parametry, z nichž alespoň jeden musí být objektového nebo výčtového typu. Naproti tomu u binárních operátorů definovaných jako metoda tříd, deklarujeme pouze jeden parametr (pravý operand). Levý operand je vyjádřen instancí, jejichž metodou operátor je.

Unární operátory

! ~ + -
Tyto operátory se definují buď jako řadové funkce s jedním parametrem objektového nebo výčtového typu nebo jako metoda bez parametrů (operand bude instance dané třídy).
++ --
U operátorů ++ -- je potřeba rozlišit prefixový a postfixový tvar. Překladač nová homonyma chápe jako prefixové operátory. Pro definování prefixového tvaru musíme operátor vytvořit buď jako metodu bez parametrů nebo jako samostatnou řadovou funkci s jedním parametrem objektového nebo výčtového typu. Naproti tomu pro postfixový tvar musíme operátor vytvořit buď jako metodu s jedním parametrem typu int nebo jako samostatnou řadovou funkci s dvěma parametry. První je objektového nebo výčtového typu, druh typu int.

Operátor indexování [ ] lze přetížit pouze jako nestatickou metodu objektového typu s jedním parametrem.

Příklad
Následující program řeší využití přetížení operátorů + a << pro komplexní čísla. První řešení využívá operátorové řadové funkce.
#include <iostream.h>
struct complex
{
double re,im;
};
//definice přetíženého operátoru
complex operator+(complex a, complex b)
{
complex pom;
pom.re=a.re+b.re;
pom.im=a.im+b.im;
return pom;
}
//přetypování výstupního operátoru
ostream &operator<<(ostream &vys, complex x)
{
vys << x.re << " + i. " << x.im;
return vys;
}
int main()
{
complex VYS,X={1.0,2.0},Y={3.0,4.0};
VYS=X+Y;
cout << VYS << endl;
return 0;
}
Následující program řeší využití přetížení operátorů +
a << pro komplexní čísla. Toto řešení využívá přístupu
pomoci třídy a přetížené operátory definujeme jako
metody dané třídy nebo spřátelené řadové funkce.
#include <iostream.h>
class COMPLEX
{
double re, im;
public:
COMPLEX(double, double);
COMPLEX() {re=im=0.0;}
// COMPLEX operator+(COMPLEX); //meně vhodné řešeni
friend COMPLEX operator+(COMPLEX,COMPLEX);
friend ostream &operator<<(ostream &vys, COMPLEX x);
COMPLEX & operator+=(COMPLEX);
};
COMPLEX::COMPLEX(double r, double i)
{
re=r;
im=i;
}
/*COMPLEX COMPLEX::operator+(COMPLEX x)
{
re=re+x.re; //nevhodne, meni se jeden z
operandu
im=im+x.im;
return *this;
} */
inline COMPLEX & COMPLEX::operator+=(COMPLEX x)
{
re += x.re;
im += x.im;
return *this;
}
// pratelske radove funkce
inline COMPLEX operator+(COMPLEX x1,COMPLEX x2)
{
return COMPLEX(x1.re + x2.re,x1.im + x2.im);
}
/* jina moznost
//moznost jak se vyhnout funkci friend,
//musi byt ale definovan operator +=
COMPLEX operator+(COMPLEX x1,COMPLEX x2)
{
COMPLEX x=x1;
x +=x2;
return x;
} */
ostream &operator<<(ostream &vys, COMPLEX x)
{
vys << x.re << " + i. " << x.im;
return vys;
}
/*****************************/
int main()
{
complex VYS,X={1.0,2.0},Y={3.0,4.0};
VYS=X+Y;
cout << VYS << endl;
COMPLEX v, a(11.0,12.0),b(13.0,14.0);
v = a + b;
cout << "v= " << v << endl;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
v += a;
cout << "v= " << v << endl;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
return 0;
}

Autor: Filip Koval
Štítky: C++/.NET
Facebook Twitter Topčlánky.cz Linkuj.cz

Komentáře

Zobrazit: standardní | od aktivních | poslední příspěvky | všechno
Článek ještě nebyl okomentován.


Nový komentář

Téma:
Jméno:
Notif. e-mail *:
Komentář:
  [b] [obr]
Odpovězte prosím číslicemi: Součet čísel nula a pět