Przeciążanie operatora dodawania i wartość zwracana

0

Cześć,
mam pytanie dotyczące wartości zwracanej przy przeciążaniu operatora dodawania w C++. Proszę o wyrozumiałość, zapoznałem się z teorią ale jakoś w odniesieniu do mojego problemu nie zdało to egzaminu...

Przeciążając operator musimy podać typ wartości zwracanej, słowo kluczowe operator, znak jaki będziemy przeciążać no i argumenty wraz z ich typami.

Typ wartości zwracanej w przypadku przeciążania jakichś operatorów operujących na zmiennych będących polami klasy będzie nosił nazwę tej klasy ->

Przykład:

class zespolona
{
   private: 
      double Rz, Ur;

   public: 
      zespolona(): Rz(0.0), Ur(0.0){}
      zespolona(double Rz, double Ur): Rz(Rz), Ur(Ur){}
      friend zespolona operator+(const zespolona &, const zespolona &); 
      double getRz() const { return Rz }
      double getUr() const { return Ur } 
}; 


zespolona operator+(const zespolona &first, const zespolona &second) 
{ 
   double i,r; 
   
   r = first.getRz() + second.getRz(); 
   i = first.getUr() + second.getUr(); 

 ** return zespolona(r,i)**
} 

};

Nie jestem w stanie zrozumieć co dokładnie zwraca ten operator. Tj. jak mam nazwać wartość zwracaną przez przeciążony operator, to jest obiekt klasy zespolona czy konstruktor ?

Semantyka wygląda na funkcję, metodę klasy zespolona ale skąd ta funkcja wie, na podstawie jakiej deklaracji wie że ma **przyjmować dokładnie dwa argumenty typu double **, przyjmować i przechowywać te dwa argumenty.

Czy to wynika z deklaracji konstruktora w klasie zespolona ? ->

zespolona(double Rz, double Ur): Rz(Rz), Ur(Ur){}

dodanie znacznika <code class="cpp"> - furious programming

1

nie mam pojęcia o co Ci chodzi

operator + przyjmuje dwa parametry bo zawsze dodajesz do siebie dwie rzeczy
zwraca obiekt po dodaniu, przyjmuje obiekty z lewej i prawej
konstruktor tu nie ma nic do rzeczy bo te obiekty już są stworzone

2
struct Complex {
  double re, im;
  Complex(double r, double i): re(r), im(i) {}
  friend Complex operator+(const Complex l, const Complex r) {
    return Complex(r.re + l.re, r.im + l.im); // zwracamy nowo utworzony obiekt...
  }
};

http://ideone.com/uUqWWF

0

@n0name_l dzięki wielkie, o to chodziło. Tj. powteirdzenie tego że to jest obiekt.

0

Równie dobrze możesz pisać

zespolona foo(r, i);
return foo;

ale lepiej return zespolona(r, i);, żeby kompilator mógł zrobić optymalizację (choć inteligentny kompilator nawet przy moim kodzie zrobi optymalizację).

No i oczywiście jeśli nie masz konstruktora przyjmującego (double, double) to żaden sposób nie zadziała.

2

Żeby nie duplikować kodu, operator+ najlepiej implementować w oparciu o operator+=, operator- o operator-=itd.

1

Dodam tylko że przeładowany operator+ nie musi być koniecznie przyjacielem klasy. U ciebie nie ma takiej konieczności ponieważ i tak korzystasz tylko z publicznego interfejsu klasy zespolona.

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