Operadores de Fluxo
Parte da seção Programação Orientada a Objetos do Journey de C++ da Coddy. Lição 43 de 104.
Os operadores de inserção (<<) e extração (>>) de fluxo permitem que você use suas classes personalizadas com std::cout e std::cin. Ao contrário dos operadores que abordamos até agora, estes devem ser implementados como funções não-membro porque o operando da esquerda é um fluxo, não a sua classe.
class Point {
int x, y;
public:
Point(int x, int y) : x(x), y(y) {}
// Declarar como friend para acessar membros privados
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;
}Ambos os operadores retornam uma referência para o stream, permitindo o encadeamento como std::cout << p1 << p2. O operador de inserção recebe o objeto por referência const, já que ele apenas lê os dados, enquanto a extração recebe uma referência não-const porque ela modifica o objeto.
Agora você pode usar Point naturalmente com streams:
Point p(3, 4);
std::cout << "Location: " << p << std::endl; // Saída: Location: (3, 4)
Point p2(0, 0);
std::cin >> p2; // Lê dois inteiros para p2Desafio
FácilVamos criar uma classe Temperature que possa ser usada perfeitamente com std::cout e std::cin por meio da sobrecarga dos operadores de fluxo. Este é um cenário prático em que você deseja exibir temperaturas em um formato legível e lê-las da entrada de forma natural.
Você criará dois arquivos para organizar seu código:
Temperature.h: Defina uma classeTemperatureque armazene um valor de temperatura (como umdouble) e um rótulo de unidade (como umchar, sendo'C'para Celsius ou'F'para Fahrenheit). Sua classe deve ter:- Membros privados para o valor e a unidade da temperatura
- Um construtor padrão que inicialize com 0.0 Celsius
- Um construtor parametrizado que receba um valor e uma unidade
- Os getters
getValue()egetUnit()(ambos const) - Declarações friend para os operadores de inserção (
<<) e extração (>>) de fluxo
Implemente os operadores de fluxo como funções não membros:
- O operador de inserção deve produzir a temperatura no formato
VALUE UNIT(por exemplo,25.5 Cou77.9 F). Use uma casa decimal para o valor. - O operador de extração deve ler um valor e um caractere de unidade do fluxo e armazená-los no objeto Temperature.
Ambos os operadores devem retornar uma referência ao fluxo para permitir o encadeamento.
main.cpp: Leia duas temperaturas da entrada. Cada temperatura é fornecida em uma linha separada no formatovalue unit(por exemplo,25.5 C).Crie dois objetos
Temperatureusando o operador de extração para lê-los destd::cin. Em seguida, produza-os usando o operador de inserção neste formato:Temperature 1: <temp1> Temperature 2: <temp2>Por exemplo, se a entrada for:
25.5 C 98.6 FA saída deverá ser:
Temperature 1: 25.5 C Temperature 2: 98.6 F
Use std::fixed e std::setprecision(1) de <iomanip> para formatar o valor da temperatura com exatamente uma casa decimal. Não se esqueça dos header guards no arquivo de cabeçalho.
Experimente você mesmo
#include <iostream>
#include "Temperature.h"
int main() {
// TODO: Criar dois objetos Temperature
// TODO: Use o operador de extração (>>) para ler duas temperaturas de std::cin
// TODO: Exibir as temperaturas usando o operador de inserção (<<)
// Formato:
// Temperature 1: <temp1>
// Temperature 2: <temp2>
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Programação Orientada a Objetos
1Fundamentos de POO
Arquivos externosBuild e compilação em C++Arquivos de cabeçalho e arquivos-fonteNamespaces e escopoIntrodução à POO em C++Classes vs. objetosO ponteiro 'this'Métodos (funções membro)Atributos (membros de dados)Noções básicas de construtores e destruidoresRevisão - calculadora simples4Propriedades de Classe
Membros de Instância vs. EstáticosGetters e SettersFunções Membro ConstPalavra-chave MutableMétodos e Variáveis EstáticosFunções e Classes FriendRevisão - Gerenciador de Contas Bancárias7Herança
Herança básicaNíveis de acesso da herançaOrdem de chamada de construtor e destrutorSobrescrita de métodosFunções virtuais e VTableHerança múltiplaHerança virtualRevisão - Hierarquia de funcionários10Visão geral da STL
Visão geral e filosofia da STLContêineres da STLIteradoresAlgoritmos da STLFunctors e expressões lambdaRecapitulação - Frequência de palavras13Padrões de Projeto — Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonFactory e Abstract FactoryPadrão BuilderPadrão ObserverPadrão Strategy2Gerenciamento de Memória
Memória Stack vs. HeapPonteiros e ReferênciasMemória Dinâmica (new/delete)Ponteiros Inteligentes em C++RAII em C++Revisão - Gerenciador de Array Dinâmico5Encapsulamento
Especificadores de acesso em C++Especificadores de acesso em profundidadeOcultação de informaçõesStruct vs ClasseClasses aninhadas e internasRecapitulação - Sistema de registros de alunos8Polimorfismo
Polimorfismo em compilação vs. execuçãoSobrecarga de funçõesFunções virtuais revisadasFunções virtuais purasClasses abstratasDesign de interfaces em C++Conversão dinâmica e RTTIRecapitulação — Calculadora de formas11Conceitos Avançados de OOP
Composição vs. HerançaMixins via CRTPIdioma PimplApagamento de TiposClasses Enum e Tipagem ForteTratamento de Exceções em OOPHierarquias de Exceções Personalizadas14Padrões de Projeto — Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositeRAII como Padrão3Construtores e Destrutores
Construtor PadrãoConstrutor ParametrizadoConstrutor de CópiaConstrutor de MovimentoListas de Inicialização do ConstrutorConstrutores DelegantesAprofundamento em DestrutoresRegra dos Três / Cinco / ZeroRevisão - Classe String6Sobrecarga de Operadores
Introdução à Sobrecarga de OperadoresSobrecarga de Operadores AritméticosSobrecarga de Operadores de ComparaçãoOperadores de FluxoSobrecarga do Operador de AtribuiçãoSobrecarga dos Operadores [] e ()Operadores de Conversão de TipoRecapitulação - Classe Matrix9Templates
Templates de FunçõesTemplates de ClassesEspecialização de TemplatesTemplates VariádicosNoções Básicas de SFINAE e Traits de TiposRecapitulação - Contêiner GenéricoPratique por conta própria: Compilador de C++ online