0Pricing
C++ Academy · Lekcja

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

  1. Operatory arytmetyczne i porównania
  2. Operatory wstawiania i ekstrakcji ze strumienia
  3. Operatory indeksowania i wywołania funkcji
  4. Operator porównania trójstronnego w C++20
← Powrót do C++ Academy