Operatori di inserimento ed estrazione dagli stream
Renda i propri tipi interoperabili con std::cout tramite >
Operatori di inserimento ed estrazione dagli stream è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Perché sovraccaricare << e >>
Permetta ai propri tipi di interagire con std::cout e std::cin sovraccaricando gli operatori di flusso.
L'operatore di inserimento <<
Lo definisca come funzione libera che riceve uno stream di output per riferimento. Restituisca lo stream per abilitare il concatenamento.
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)Perché una funzione libera?
Se lo scrivesse come membro, l'operando a sinistra dovrebbe essere un Point: impossibile, perché a sinistra ci serve std::ostream. Le funzioni libere supportano entrambi gli ordinamenti.
L'operatore di estrazione >>
Lo definisca per leggere dagli stream di input. Convalidi i dati e imposti il failbit in caso di errore.
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;
}Impostazione dello stato di errore dello stream
Se l'analisi non riesce, chiami is.setstate(std::ios::failbit). Il chiamante può rilevare l'errore con !is o is.fail().
Dichiarazioni friend
Se l'operatore deve accedere ai membri privati, lo dichiari come friend all'interno della classe.
class Point {
int x_, y_;
public:
friend std::ostream& operator<<(std::ostream& os, const Point& p);
};Tipi di stream basati su template
Per ottenere la massima portabilità, utilizzi come parametro il tipo di carattere. È utile per gli stream con caratteri estesi.
template <typename CharT>
std::basic_ostream<CharT>& operator<<(
std::basic_ostream<CharT>& os, const Point& p) {
return os << "(" << p.x << ", " << p.y << ")";
}Concatenamento
Restituire lo stream permette agli utenti di concatenare le operazioni.
std::cout << "Result: " << point << ", distance: " << dist;Formattazione personalizzata
Utilizzi std::ios::fmtflags o std::format di C++20 per una formattazione avanzata. Gli stream sono più semplici, ma più difficili da localizzare.
Output in stile JSON
È possibile combinare diverse scelte di formattazione nel proprio operatore. Per output complessi, scriva funzioni di supporto.
Lettura di più righe
Utilizzi std::getline per la lettura basata sulle righe, quindi analizzi i dati con uno stringstream: in questo modo mantiene semplice il proprio operator>>.
Suggerimento sulle prestazioni
Per la registrazione con throughput molto elevato, preferisca librerie dedicate (spdlog, fmt): offrono prestazioni nettamente superiori a quelle degli stream.
Verifica rapida
Perché operator<< per un tipo definito dall'utente viene definito come funzione libera anziché come membro?
Riepilogo
Sovraccarichi operator<< e operator>> come funzioni libere che ricevono lo stream per riferimento. Restituisca lo stream per consentire il concatenamento. Imposti il failbit in caso di errori di analisi. Utilizzi friend quando è necessario accedere ai membri privati.
Domande Frequenti
La lezione «Operatori di inserimento ed estrazione dagli stream» è gratuita?
Sì — il testo completo di «Operatori di inserimento ed estrazione dagli stream» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Operatori di inserimento ed estrazione dagli stream»?
Renda i propri tipi interoperabili con std::cout tramite > Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Operatori di inserimento ed estrazione dagli stream»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Operatori aritmetici e di confronto
- Operatori di inserimento ed estrazione dagli stream
- Operatori di indicizzazione e chiamata di funzione
- Operatore di confronto a tre vie in C++20