2010-07-24 19 views
5

W poniższym przykładzie, co exactally jest operatorem << robi? Zgaduję, że to nie jest bitowy operator.Jaki jest << operator robi w C++?

std::cout << "Mouse down @ " << event.getPos() << std::endl; 

rozumiem co zrobi kod tutaj: Używaj standardowego się wysłać ten tekst, wyślij końca linii. Po prostu nigdy nie się spotkałem korzystania z tego < < oprócz surowej binarny.

Zaczynam się z C++. I jako operator rodzaju, trudno szukać opisu tego i co to znaczy. Czy ktoś może mnie oświecić i/lub dać mi wskazówkę, na co google?

Dzięki Ross

+0

Mylisz się, ponieważ nie zastąpi @. – Puppy

Odpowiedz

11

Odpowiedź brzmi: Operator << domyślnie wykonuje przesunięcia w lewo dla typów integralnych, ale może być przeciążony, aby robić to, co tylko chcesz!

Ta składnia do przeciągania ciągów do strumienia była pierwszą (jak sądzę) zademonstrowaną w książce wynalazcy C++ Bjarne Stroustroup o tytule: The C++ Programming Language. Osobiście uważam, że ponowne zdefiniowanie operatora do wykonania IO jest efekciarskie; tworzy fajny kod demo, ale nie przyczynia się do tego, aby uczynić kod zrozumiałym. Przeciążenie operatora jako technika zostało szeroko skrytykowane w środowisku programistów.


EDIT: Ponieważ nikt nie wspomniał jeszcze o tym:

operator<< jest zdefiniowana w klasie ostream, którego cout jest instancją. Definicja klasy znajduje się w iostream library, która jest #include 'd jako .

+0

Myślę, że jest to świetne narzędzie do wypowiadania dokładnie tego, co chcesz w swoim kodzie, i bardzo przydatne, gdy używasz stringów i streamów do przesyłania danych do czegoś. – rubenvb

+0

W rzeczywistości, jeśli chcesz być pedantyczny, 'operator <<' jest wolną funkcją z "ostream" jako pierwszy argument. –

+0

@Billy ONeal: Na pewno jesteś bardziej ekspertem niż ja, ale czy nie jest to metoda instancji klasy "ostream", z (cokolwiek jest po prawej) jako jej pierwszą argumentacją? –

-4

Jest to "bitowe przesunięcie w lewo" operator.

n < < P

przesuwa bity pozycji Pn Lewicy. Zero bitów zostaje przeniesione do pozycji niskiego rzędu. 3 < < 2 12.

W kontekście pytania to pcha coś do „cout”, który jest obecny strumień wyjściowy.

+0

-1 Nie w tym kontekście ... –

+0

@Nick Brooks: Edytowałem twoją ostatnią linijkę, aby było nieco jaśniejsze, ale prawdopodobnie jest już za późno, by zapisać twoją odpowiedź od nienawiści, którą dostaje. –

3

To czasem nazywa się „strumień operatora wstawiania”, a jest to najbardziej powszechnie używane: wstawianie danych do strumienia. Czasem jednak widziałem przeciążone aby wstawić dane do innych obiektów podczas robienia rzeczy jak serializacji, na przykład.

3

Jak każdy operatorów w C++, < < robi operacje. Korzystanie z przeciążenia, z ostream lewym operandem (std :: cout jest typu ostream), służy jako operator strumienia do drukowania danych różnych typów. Na przykład, można zrobić

int x = 10; 
std::string y = " something"; 
std::cout << x << y << std::endl; 

wyjście to "coś" 10.

@ nie jest zastępowane przez nic w tym kontekście. operator < < po prostu zrzuć wynik.

std :: endl to nie tylko koniec linii, to również opróżnia wynik do urządzenia wyjściowego.

+0

dzięki za flagowanie również "@" i "std :: endl". – Ross

1

Spróbuj napisać program, gdzie tworzysz obiekt i wywołać przeciążony < < operatora,

class x { 
    //declare some pvt variables 
    //overload << operator 
}; 

int main() { 
    x obj; 
    cout << obj; 
} 

Dzięki temu można zrozumieć uzasadnienie za pomocą następującej klauzuli

cout << string_var << int_var; 

Ty możliwe, przyjmij "string" i "int" jako klasy, które przeciążały operatora < <, mimo że nie są prawdziwe.

Powiązane problemy