Operatory strumieniowe
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 43 z 104.
Operatory wstawiania (<<) i pobierania (>>) pozwalają używać własnych klas razem z std::cout i std::cin. W przeciwieństwie do operatorów omówionych do tej pory, muszą być zaimplementowane jako funkcje niestowarzyszone, ponieważ lewym operandem jest strumień, a nie Twoja klasa.
class Point {
int x, y;
public:
Point(int x, int y) : x(x), y(y) {}
// Zadeklaruj jako friend, aby uzyskać dostęp do prywatnych pól
friend std::ostream& operator<<(std::ostream& os, const Point& p);
friend std::istream& operator>>(std::istream& is, Point& p);
};
std::ostream& operator<<(std::ostream& os, const Point& p) {
os << "(" << p.x << ", " << p.y << ")";
return os;
}
std::istream& operator>>(std::istream& is, Point& p) {
is >> p.x >> p.y;
return is;
}Oba operatory zwracają referencję do strumienia, co umożliwia łączenie ich w łańcuch, na przykład std::cout << p1 << p2. Operator wstawiania przyjmuje obiekt przez referencję const, ponieważ tylko odczytuje dane, natomiast operator pobierania przyjmuje referencję niebędącą const, ponieważ modyfikuje obiekt.
Teraz możesz naturalnie używać Point ze strumieniami:
Point p(3, 4);
std::cout << "Location: " << p << std::endl; // Wynik: Location: (3, 4)
Point p2(0, 0);
std::cin >> p2; // Wczytaj dwie liczby całkowite do p2Wyzwanie
ŁatwyZbudujmy klasę Temperature, której można wygodnie używać z std::cout i std::cin dzięki przeciążeniu operatorów strumieniowych. To praktyczny przykład sytuacji, w której chcesz wyświetlać temperatury w czytelnym formacie i w naturalny sposób odczytywać je z wejścia.
Utworzysz dwa pliki, aby uporządkować kod:
Temperature.h: Zdefiniuj klasęTemperature, która przechowuje wartość temperatury (typudouble) oraz oznaczenie jednostki (typuchar,'C'dla stopni Celsjusza lub'F'dla stopni Fahrenheita). Twoja klasa powinna zawierać:- Prywatne składowe przechowujące wartość temperatury i jednostkę
- Konstruktor domyślny, który inicjalizuje temperaturę jako 0.0 stopni Celsjusza
- Konstruktor parametryzowany, który przyjmuje wartość i jednostkę
- Metody pobierające
getValue()igetUnit()(obie oznaczone jako const) - Deklaracje zaprzyjaźnionych operatorów wstawiania do strumienia (
<<) i pobierania ze strumienia (>>)
Zaimplementuj operatory strumieniowe jako funkcje niezwiązane z klasą:
- Operator wstawiania powinien wyświetlać temperaturę w formacie
VALUE UNIT(np.25.5 Club77.9 F). Użyj jednego miejsca po przecinku dla wartości. - Operator pobierania powinien odczytać ze strumienia wartość i znak jednostki, a następnie zapisać je w obiekcie Temperature.
Oba operatory muszą zwracać referencję do strumienia, aby umożliwić łączenie operacji.
main.cpp: Odczytaj z wejścia dwie temperatury. Każda temperatura jest podana w osobnym wierszu w formacievalue unit(np.25.5 C).Utwórz dwa obiekty
Temperaturei użyj operatora pobierania, aby odczytać je zstd::cin. Następnie wyświetl je za pomocą operatora wstawiania w tym formacie:Temperature 1: <temp1> Temperature 2: <temp2>Na przykład, jeśli dane wejściowe to:
25.5 C 98.6 FDane wyjściowe powinny wyglądać tak:
Temperature 1: 25.5 C Temperature 2: 98.6 F
Użyj std::fixed i std::setprecision(1) z <iomanip>, aby sformatować wartość temperatury z dokładnie jednym miejscem po przecinku. Nie zapomnij o strażnikach nagłówka w pliku nagłówkowym.
Spróbuj swoich sił
#include <iostream>
#include "Temperature.h"
int main() {
// TODO: Utwórz dwa obiekty Temperature
// TODO: Użyj operatora pobierania (>>), aby odczytać dwie temperatury z std::cin
// TODO: Wyświetl temperatury za pomocą operatora wstawiania (<<)
// Format:
// Temperature 1: <temp1>
// Temperature 2: <temp2>
return 0;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online