Tutorial de C++ Moderno
Este tutorial tem como objetivo fornecer aos desenvolvedores experientes uma referência rápida sobre os novos recursos do C++11/14/17/20. Ele aborda melhorias na usabilidade da linguagem, melhorias de desempenho em tempo de execução, novos contêineres, ponteiros inteligentes e gerenciamento de memória, expressões regulares, programação concorrente e uma prévia do C++20.
Visão Geral do Curso
📚 Resumo do Conteúdo
Este tutorial foi projetado para fornecer aos desenvolvedores experientes uma referência rápida sobre os novos recursos do C++11/14/17/20. O conteúdo abrange melhorias na usabilidade da linguagem, melhorias em tempo de execução, o uso de novos contêineres, ponteiros inteligentes e gerenciamento de memória, expressões regulares, programação concorrente e uma prévia do C++20.
Acelere seu aprendizado com o C++11/14/17/20 e entre pela porta de entrada da programação moderna em C++.
Autor: 欧长坤 (Ou Changkun)
Agradecimentos: Licenciado sob a licença CC BY-NC-ND 4.0, agradecimentos a todos os contribuidores do GitHub e à comunidade relacionada.
🎯 Objetivos de Aprendizagem
- Identificar e verificar o ambiente do compilador C++ e a arquitetura-alvo usando ferramentas de linha de comando.
- Explicar a compatibilidade padrão e a história de sobreposição entre C (C89, C99, C11) e C++ (C++98, C++1x).
- Implementar vinculação cruzada de linguagens funcionais usando cabeçalhos
extern "C"e fluxos de compilação de múltiplos estágios. - Resolver ambiguidades de ponteiros usando
nullptre implementar lógica em tempo de compilação comconstexpreif constexpr. - Simplificar declarações complexas usando
auto,decltypee alias de tipo (using), garantindo um design robusto orientado a objetos comoverrideefinal. - Projetar código altamente genérico usando templates variádicos, expressões fold e dedução de parâmetros de template não-tipo.
- Definir e implementar expressões Lambda usando diversos modos de captura (Valor, Referência, Expressão e Genérico).
- Utilizar
std::functionestd::bindpara criar invólucros de função flexíveis e aplicações parciais de funções. - Classificar expressões em Lvalues, Prvalues e Xvalues, e aplicar Semântica de Movimentação para otimizar o gerenciamento de recursos de classe.
- Diferenciar os modelos de memória e casos de uso de
std::array(tamanho fixo, pilha) estd::vector(tamanho dinâmico, heap).
🔹 Lição 1: Evolução Histórica do C++ e Ambiente
Visão Geral: Esta lição aborda a base técnica do ambiente de desenvolvimento C++ e sua relação histórica com a linguagem C. Detalha como os padrões C++ (C++98 até C++1x) se sobrepõem aos padrões C (C89 até C11) e fornece os mecanismos específicos, como extern "C", necessários para compilar e vincular com sucesso bases de código mistas C e C++.
Resultados de Aprendizagem:
- Identificar e verificar o ambiente do compilador C++ e a arquitetura-alvo usando ferramentas de linha de comando.
- Explicar a compatibilidade padrão e a história de sobreposição entre C (C89, C99, C11) e C++ (C++98, C++1x).
- Implementar vinculação cruzada de linguagens funcionais usando cabeçalhos
extern "C"e fluxos de compilação de múltiplos estágios.
🔹 Lição 2: Usabilidade da Linguagem: Sintaxe Moderna e Templates
Visão Geral: Esta lição explora a evolução do C++ desde o C++11 até o C++20, focando em melhorias que aumentam a clareza do código, segurança de tipos e flexibilidade de templates. Os alunos dominarão recursos modernos de sintaxe como inferência de tipo, avaliação em tempo de compilação com constexpr e técnicas avançadas de template, incluindo templates variádicos e expressões fold.
Resultados de Aprendizagem:
- Resolver ambiguidades de ponteiros usando
nullptre implementar lógica em tempo de compilação comconstexpreif constexpr. - Simplificar declarações complexas usando
auto,decltypee alias de tipo (using), garantindo um design orientado a objetos robusto comoverrideefinal. - Projetar código altamente genérico usando templates variádicos, expressões fold e dedução de parâmetros de template não-tipo.
🔹 Lição 3: Melhorias em Tempo de Execução: Lambdas e Semântica de Movimentação
Visão Geral: Esta lição aborda melhorias críticas em tempo de execução introduzidas no C++ moderno (C++11/14), focando em construtos de programação funcional e gerenciamento eficiente de recursos. Os alunos dominarão expressões Lambda — incluindo capturas genéricas e por expressão do C++14 — e mergulharão nos mecanismos da Semântica de Movimentação, Categorias de Valor (Lvalues/Rvalues) e Encaminhamento Perfeito para eliminar cópias desnecessárias em aplicações de alto desempenho.
Resultados de Aprendizagem:
- Definir e implementar expressões Lambda usando diversos modos de captura (Valor, Referência, Expressão e Genérico).
- Utilizar
std::functionestd::bindpara criar invólucros de função flexíveis e aplicações parciais de funções. - Classificar expressões em Lvalues, Prvalues e Xvalues, e aplicar Semântica de Movimentação para otimizar o gerenciamento de recursos de classe.
🔹 Lição 4: Contêineres Modernos: std::array
Visão Geral: Esta lição apresenta std::array, um contêiner introduzido no C++11 como alternativa moderna aos arrays tradicionais em C. Explora os benefícios de usar um contêiner de tamanho fixo que encapsula arrays brutos, oferecendo uma interface mais segura, compatível com a STL e alocação de memória na pilha.
Resultados de Aprendizagem:
- Diferenciar os modelos de memória e casos de uso de
std::array(tamanho fixo, pilha) estd::vector(tamanho dinâmico, heap). - Inicializar e gerenciar corretamente
std::arrayusando funções membros como.size()e.empty(). - Aplicar algoritmos da Biblioteca Padrão (STL) e loops baseados em faixa a objetos
std::array.
🔹 Lição 5: Ponteiros Inteligentes e Gerenciamento de Memória RAII
Visão Geral: Esta lição apresenta o princípio de Aquisição de Recursos é Inicialização (RAII) como filosofia fundamental do gerenciamento de memória moderno em C++. Aborda a transição do manuseio manual de ponteiros para gestão automatizada usando std::unique_ptr para propriedade exclusiva, std::shared_ptr para compartilhamento baseado em contagem de referências e std::weak_ptr para quebrar dependências circulares.
Resultados de Aprendizagem:
- Compreender e aplicar o princípio RAII para garantir que recursos sejam liberados quando saírem do escopo.
- Implementar modelos de propriedade compartilhada e exclusiva usando
std::shared_ptrestd::unique_ptr. - Identificar e resolver vazamentos de memória causados por referências circulares usando
std::weak_ptr.
🔹 Lição 6: Expressões Regulares e Análise de Strings
Visão Geral: Esta lição aborda a implementação de Expressões Regulares usando a biblioteca padrão do C++11 (std::regex) e sua aplicação prática na análise de requisições HTTP. Os alunos aprenderão a sintaxe dos quantificadores regex, o uso de std::smatch para capturar resultados e a integração arquitetônica dessas ferramentas em um ambiente de servidor Web baseado em templates.
Resultados de Aprendizagem:
- Identificar e aplicar caracteres especiais de expressão regular (quantificadores) para definir padrões de string.
- Utilizar
std::regexestd::smatchpara validar nomes de arquivos e extrair dados de strings. - Implementar a lógica central do servidor, incluindo análise de requisições HTTP e mapeamento de recursos usando modelos modernos de memória e contêineres C++.
🔹 Lição 7: Paralelismo, Concorrência e Modelos de Memória
Visão Geral: Esta lição aborda a mudança fundamental no C++11 em direção a um modelo padronizado de multithreading. Transita desde o gerenciamento básico de threads e bloqueios baseados em RAII até primitivas de sincronização avançadas como futuros e variáveis de condição, concluindo com o rigoroso modelo de memória do C++11, operações atômicas e garantias de consistência de memória.
Resultados de Aprendizagem:
- Gerenciar ciclos de vida de threads e proteger recursos compartilhados usando
std::thread,std::mutexe wrappers RAII (std::lock_guard,std::unique_lock). - Implementar fluxos assíncronos e comunicação entre threads usando
std::future,std::packaged_taskestd::condition_variable. - Aplicar tipos
std::atomice selecionar estratégias adequadas destd::memory_orderpara garantir visibilidade de memória e evitar reordenação ilegal de instruções.
🔹 Lição 8: Biblioteca Padrão: Atualizações do Sistema de Arquivos
Visão Geral: Esta lição explora a evolução da Biblioteca Padrão do C++, focando nas funcionalidades de alto nível introduzidas no C++11 e em padrões posteriores. Destaca a transição de implementações específicas de plataforma ou de baixo nível para utilitários padronizados de alto nível, como std::filesystem e ferramentas de concorrência.
Resultados de Aprendizagem:
- Identificar os principais componentes de concorrência adicionados à Biblioteca Padrão no C++11.
- Reconhecer
std::filesystemcomo uma grande adição para gerenciamento moderno de caminhos e arquivos. - Compreender o papel de abstrações de alto nível na modernização do desenvolvimento em C++.
🔹 Lição 9: Recursos Modernos Variados
Visão Geral: Esta lição cobre uma seleção de recursos impactantes introduzidos no C++11 e refinados em padrões posteriores para melhorar segurança de tipos, desempenho e legibilidade de código. Os alunos aprenderão sobre o tipo long long int, especificações de exceção com noexcept, literais de string aprimorados e literais definidos pelo usuário, além de controle granular sobre alinhamento de memória via alignof e alignas.
Resultados de Aprendizagem:
- Identificar e implementar o tipo
long long intpara precisão inteira estendida. - Aplicar o especificador
noexceptpara otimizar o tratamento de exceções e usar o operadornoexceptpara consultar a segurança de funções. - Utilizar Literais de String Bruta para simplificar definições complexas de strings e criar Literais Definidos pelo Usuário para sufixos personalizados de tipos.
🔹 Lição 10: C++20: O Futuro da Linguagem
Visão Geral: Esta lição apresenta os "Quatro Pilares" do C++20: Conceitos, Módulos, Coroutines e Faixas. Esses recursos representam a evolução mais significativa da linguagem desde o C++11, focando em melhorar a segurança de templates, eficiência de compilação, programação assíncrona e processamento de dados em estilo funcional.
Resultados de Aprendizagem:
- Identificar e descrever os quatro principais recursos introduzidos no padrão C++20.
- Explicar o papel de Conceitos e Restrições na melhoria do tratamento de erros em templates e no design.
- Diferenciar a abordagem tradicional baseada em cabeçalhos do novo sistema de Módulos.