Operatory wstawiania i ekstrakcji ze strumienia
Spraw, aby własne typy współpracowały ze std::cout za pomocą >
Operatory wstawiania i ekstrakcji ze strumienia to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.
Dlaczego warto przeciążać << i >>
Przeciążając operatory strumieniowe, można umożliwić współpracę własnych typów z std::cout i std::cin.
Operator wstawiania <<
Należy zdefiniować go jako funkcję wolnostojącą przyjmującą strumień wyjściowy przez referencję. Należy zwrócić strumień, aby umożliwić łańcuchowanie operacji.
struct Point { int x, y; };
std::ostream& operator<<(std::ostream& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}
Point p{3, 4};
std::cout << p << "\n"; // (3, 4)Dlaczego funkcja wolnostojąca?
Gdyby operator został zapisany jako metoda, lewy operand musiałby być typu Point — co jest niemożliwe, ponieważ po lewej stronie potrzebujemy std::ostream. Funkcje wolnostojące obsługują oba porządki operandów.
Operator ekstrakcji >>
Należy zdefiniować go do odczytu ze strumieni wejściowych. Należy sprawdzać poprawność danych i w przypadku błędu ustawiać failbit.
std::istream& operator>>(std::istream& is, Point& p) {
char open, comma, close;
is >> open >> p.x >> comma >> p.y >> close;
if (open != '(' || comma != ',' || close != ')')
is.setstate(std::ios::failbit);
return is;
}Ustawianie stanu błędu strumienia
Jeśli analiza danych się nie powiedzie, należy wywołać is.setstate(std::ios::failbit). Wywołujący może wykryć błąd za pomocą !is lub is.fail().
Deklaracje friend
Jeśli operator wymaga dostępu do prywatnych składowych, należy zadeklarować go jako friend wewnątrz klasy.
class Point {
int x_, y_;
public:
friend std::ostream& operator<<(std::ostream& os, const Point& p);
};Szablonowe typy strumieni
Aby zapewnić maksymalną przenośność, należy użyć parametru szablonu określającego typ znaku. Jest to przydatne w przypadku strumieni szerokoznakowych.
template <typename CharT>
std::basic_ostream<CharT>& operator<<(
std::basic_ostream<CharT>& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}Łańcuchowanie
Zwracanie strumienia pozwala łańcuchować operacje.
std::cout << "Result: " << point << ", distance: " << dist;Niestandardowe formatowanie
Do zaawansowanego formatowania należy użyć std::ios::fmtflags lub elementu std::format z C++20. Strumienie są prostsze, ale trudniej je lokalizować.
Wyjście w stylu JSON
W operatorze można uwzględnić różne sposoby formatowania. W przypadku złożonych danych wyjściowych należy napisać funkcje pomocnicze.
Odczytywanie wielu wierszy
Do odczytu wierszy należy użyć std::getline, a następnie przeanalizować dane za pomocą stringstream — dzięki temu operator>> pozostaje prosty.
Wskazówka dotycząca wydajności
W przypadku rejestrowania danych z bardzo dużą przepustowością należy preferować wyspecjalizowane biblioteki (spdlog, fmt) — znacznie przewyższają one wydajnością strumienie.
Szybkie sprawdzenie
Dlaczego operator<< dla typu użytkownika definiuje się jako funkcję wolnostojącą, a nie metodę?
Podsumowanie
Operatory operator<< i operator>> należy przeciążać jako funkcje wolnostojące przyjmujące strumień przez referencję. Należy zwracać strumień, aby umożliwić łańcuchowanie. W przypadku błędów analizy danych należy ustawić failbit. Gdy potrzebny jest dostęp do prywatnych składowych, należy użyć friend.
Często zadawane pytania
Czy lekcja „Operatory wstawiania i ekstrakcji ze strumienia” jest bezpłatna?
Tak — pełny tekst „Operatory wstawiania i ekstrakcji ze strumienia” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Operatory wstawiania i ekstrakcji ze strumienia”?
Spraw, aby własne typy współpracowały ze std::cout za pomocą > Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C++ Academy?
Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.
Ile czasu zajmuje lekcja „Operatory wstawiania i ekstrakcji ze strumienia”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?
Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Operatory arytmetyczne i porównania
- Operatory wstawiania i ekstrakcji ze strumienia
- Operatory indeksowania i wywołania funkcji
- Operator porównania trójstronnego w C++20