Przeładowanie operatorów dwuargumentowych wg Symfonii C++

0

Czytając Symfonię, natknąłem się na paragraf w którym jest napisane:

Operatory dwuargumentowe możemy także przeładowywać na dwa sposoby:

  • albo jako funkcję składową niestatyczną wywołaną z jednym argumentem x.operator@(y)
  • albo jako funkcję nie-składową (czyli zwykłą), wywoływaną z dwoma argumentami. operator@(x,y)
    Taka funkcja operatorowa zostaje automatycznie wywołana, gdy obok znaczka danego operatora znajdą się dwa argumenty określonego przez nas typu.

A co jeśli tymi dwoma argumentami są obiekty danej klasy ? Wtedy przecież funkcja nie-składowa musi chyba mieć dwa argumenty wywołania funkcji ?

dodanie znacznika <quote> - @furious programming

0

W przypadku definicji operatora dwuargumentowego wewnątrz klasy, pierwszym argumentem jest *this.

Nie rozumiem trochę jaką masz wątpliwość. Jeżeli operator ma mieć dwa argumenty, a definiując funkcję wewnątrz klasy podajesz tylko jeden (prawy), to chyba naturalne, że tym drugim (lewym) będzie obiekt tej klasy wewnątrz której właśnie jesteś. No bo co innego mogłoby być?

0

Jeśli mam klase zespolona to jeśli w argumentach funkcji mam dwa argumenty typu zespolona to w deklaracji metody w klasie muszę podać dwa, a nie jeden argument.

zespolona operator+(zespolona a, zespolona b)
{
    zespolona suma;
    suma.rzeczyw = a.rzeczyw + b.rzeczyw;
    suma.urojon = a.urojon + b.urojon;
    return suma;
} 

Można te funkcję umieścić poza klasą, ale jakby była ona w klasie to musi mieć dwa argumenty, a nie jeden.

1

Spójrz na ten kod: http://ideone.com/D7E2KE

Tak wygląda operator w środku:

  OperatorInside operator+(const OperatorInside &rhs) {
    const OperatorInside sum(a + rhs.a);
    return sum;
  }

A tak na zewnątrz:

OperatorOutside operator+(const OperatorOutside &lhs,
                          const OperatorOutside &rhs) {
 
  const OperatorOutside sum(lhs.a + rhs.a);
  return sum;                  	
}

Operator dwuargumentowy wewnątrz klasy nawet nie może mieć więcej niż jedngo argumentu (skończy się to błędem kompilacji).

1 użytkowników online, w tym zalogowanych: 0, gości: 1