W jaki sposób program C++ oblicza wartość "ACCA"?
Pierwsza wyświetlana litera to "A". To wyjście jest powiązane z tą linią:
Base obj;
... w której tworzysz nową instancję Base.
Następny wiersz jest nieco skomplikowana:
obj = obj+obj;
Normalnie, to jest tłumaczona na obj.operator+(obj)
, ale nie masz operator + przeciążone w klasie Base
, więc to tłumaczenie nie jest ważna. Pozostała możliwość jest taka, że operator + jest rzeczywiście operatorem dodawania liczb.
I tak, jest to możliwe, ponieważ podałeś obsadę do int
. Tak więc możliwe jest przekształcenie każdego członu równania w int
... i dlatego operator int
jest wywoływana dwa razy. Faktyczna liczba wywołań operator int
zależy od aktywowanych optymalizacji. Na przykład kompilator może zdawać sobie sprawę, że oba terminy są takie same, a następnie utworzyć nowy tymczasowy, gdy operator int
został wywołany po raz pierwszy. W takim przypadku zobaczysz CA zamiast CC.
Na koniec wykonywane jest wyrażenie przypisania obj.operator=(temp)
. Tutaj słowo kluczowe to temp. Aby zadziałał defaultoperator=
, ponieważ nie jest on przeciążony, musisz mieć obiekt Base
po prawej stronie. W rzeczywistości jest to możliwe, ponieważ Base
używa int
do budowania nowych instancji. Ok, więc wynikiem obj + obj
był int
(powiedzmy, że nazywa się „x”) liczba i kompilator tworzy tymczasowy obiekt klasy Base
, która jest zbudowana z numerem x, jak następujący wiersz został stracony:
Base temp(x);
W ten sposób ostatnia litera jest "A". Znowu, wiele kompilatorów może w niektórych przypadkach unikać budowania tymczasowych, więc na końcu nie można zobaczyć litery "A".
pamiętać, że ta linia:
obj = obj + obj
było zatem rozkładowi w:
int x = ((int) obj) + ((int) obj);
Base temp(x);
obj = temp;
dyspozycja końcowym ma wynik jakby pamięć, w której obj
siedzi będą zajęte z treścią temp
(to rola domyślnego konstruktora kopiowania, który wykonuje operator=
dla każdego członka klasy, zobacz ponownie "regułę trzech").
Przeciążenie operatora wiąże się z wieloma problemami, które być może nie są przewidziane, jeśli nie masz większej lub mniejszej znajomości języka, jak widać. Weź również pod uwagę, że języki takie jak Java całkowicie uniemożliwiają jego użycie, podczas gdy C# pozwala na to z kontrolowanej perspektywy.
FYI; Jest to konstrukcja stworzona do tworzenia ACCA, jako ćwiczenie dla czytelnika. –