Mały problem ze zrozumieniem operatorów w klasach.

0

Witam! Pracuję nad klasą Coords. Będzie to dużo lepszy odpowiednik windowsowego COORD (przynajmniej w zamierzeniu). Mam już konstruktor, parę funkcji, ... (destruktora i operatora kopiującego mi nie trzeba, ponieważ nie operuję na wskaźnikach). I tak w zasadzie mam kilka pytań a propos operatora.

  1. Dlaczego argument przyjmuje się jako referencję?

  2. Dlaczego typ zwracany jest referencją? (W przykładzie z książki: "ListaPowiazana& ListaPowiazana::operator= [...]") i czy trzeba go zwracać jako referencję? Mam jeden operator który zwraca bool (tak, jest to ==). Musi zwracać bool jak referencję?

  3. Dlaczego w tym:

if(this == &inna)
{
    //Zwróć obiekt this, aby zachować możliwość łączenia przypisań
    return *this;
}
a) sprawdza się obiekt "inna" w postaci referencji?

b) zwraca się obiekt jako wskaźnik? Czy ma to związek z pytaniem drugim? Dodatkowo, piszę teraz operator dodawania. Czy muszę 
zwrócić obiekt jako wskaźnik?
Coords& Coords::operator+(const Coords& otherCoords){
    Coords tmpCoords(this->x+otherCoords.x,this->y+otherCoords.y);
    return tmpCoords;
}
  1. Dlaczego tu:

friend ostream& operator<< (ostream&,Foo const&);
jest "friend" co to oznacza?

4

O jakim operatorze mowa?

Dlaczego argument przyjmuje się jako referencję?

Żeby nie kopiować.

Dlaczego typ zwracany jest referencją? (W przykładzie z książki: "ListaPowiazana& ListaPowiazana::operator= [...]") i czy trzeba go zwracać jako referencję? Mam jeden operator który zwraca bool (tak, jest to ==). Musi zwracać bool jak referencję?

Referencję zwracasz do istniejącego obiektu (np. operator += nie tworzy nowego), kopię jeśli tworzysz nowy.

3a, 3b: kompletnie odwrotnie. Poczytaj o referencjach i wskaźnikach. Mając wskaźnik, operator * wyłuskuje lvalue (powiedzmy referencję) danego obiektu. Analogicznie, mając obiekt, operator & zwraca jego adres - wskaźnik.

Samo sprawdzenie jest idiomatyczne dla operatorów przypisania, ale wiele osób uważa, że nie powinno się tego definiować w swoich klasach.

Dlaczego tu jest "friend" co to oznacza?

Oznacza, że funkcja ma dostęp do części prywatnych klasy. Ponadto w tym przypadku oznacza, że funkcja nie ma niejawnego parametru this, t.j. jest statyczna (ale jej umiejscowienie jest bardzo ciekawe)

Dodatkowa lektura: https://dsp.krzaq.cc/post/304/jak-przeladowywac-operatory-w-mojej-klasie/

0

Trochę OT i w cudzym wątku (przepraszam, @PrezesiQ), ale bardzom zaciekawiony...

kq napisał(a):

Samo sprawdzenie jest idiomatyczne dla operatorów przypisania, ale wiele osób uważa, że nie powinno się tego definiować w swoich klasach.

Dlaczego nie powinno? Pierwsze słyszę i bym prosił @kq o jakieś szczegóły...?

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