2012-03-28 27 views
5

Myślę, że poniższy kod może być użyty do tworzenia manipulatorów.Przeciążanie operatora dla manipulatorów

#include<iostream> 
ostream & symbol(ostream & output) 
{ 
    return output << "\tRs"; 
} 

działa poprawnie. Poniższe oświadczenie

cout << "Total amount: " << 567 << symbol; 

daje wyświetlamy

Total amount: 567 Rs 

Ale nie rozumiem, dlaczego to działa. Mam następujące informacje o przeciążanie operatora w C++.

  1. tylko dotychczasowi operatorzy mogą być przeciążeni. Nie można utworzyć nowych operatorów. Ale symbol symbol nie jest istniejącym operatorem.

  2. W rachunku (Cout < < „Całkowita ilość” < < symboli;), wydaje się, że < < jest przeciążenia operatora i symbolu jest zmienną/obiektu. Ale nie zadeklarowałem symbolu jako zmiennej/obiektu.

  3. dlaczego są one za pomocą instrukcji return (wyjście powrót < < "\" TRS;) ?. Myślę (powrót "\" TRS;) lub (wyjście < < "\" TRS;) powinien działać (próbowałem ale nie działa :))

Właściwie nie wiem. jak działa powyższy kod. Czy jest ktoś, kto mógłby wyjaśnić działanie powyższego operatora przeciążającego?

Odpowiedz

7

Przekazujesz operatorowi funkcjęsymbol operatorowi <<. << wywoła tę funkcję na bieżącym ostream (z parametrem ostream jako parametrem), uzyskując wynik, który widzisz. (Dokładna wersja << nazywany jest: ostream::operator<< (ostream& (*pf)(ostream&)); - patrz reference aby uzyskać więcej informacji)

Typ zwracany jest ostream, aby umożliwić łańcuchowym stwardnienia << „s. Nie potrzebowałbyś tego technicznie w konkretnym przypadku, ponieważ << ma dostęp do strumienia, ale ma to na celu zachowanie spójności z operatorami (myślę). Oczywiście << wymaga tego parametru zwrotu, więc nie masz wyboru :)

+0

masz na myśli, że istnieje predefiniowany operator 'przecięcia << (ostream &, ostream & (*) (ostream &))? – Vlad

+1

'operator << (ostream i (* pf) (ostream &));' jest członkiem ['std :: ostream] (http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/) – Attila

1

Istnieje już operator<< przeciążenie, które jest członkiem basic_ostream

basic_ostream& operator<<(basic_ostream& (*pf)(basic_ostream&)); 

Podpis pasuje do funkcji (jak również std::endl, std::flush, etc).

Powiązane problemy