Programação C++ Moderna
C++03 / C++11 / C++14 / C++17 / C++20 / C++23 / C++26
Este curso de acesso aberto é direcionado àqueles que já estão familiarizados com C e programação orientada a objetos para um nível de proficiência em programação C++. O curso cobre os fundamentos da programação C++ e avança para semântica e conceitos avançados de C++.
Principais recursos :
- Gratuito e atualizado com frequência
- 26 palestras, mais de 1.800 slides
- Inclui os conceitos e recursos do último padrão de linguagem
- Ensino prático : descrições curtas e não detalhadas associadas ao código
- Exemplos mínimos de código para mostrar apenas um recurso ou problema específico sem divagar
- Aspectos complementares da linguagem : ferramentas, convenções de codificação, organização de projetos e otimização de código
- Baseado na experiência : muitos aspectos, exemplos e problemas vêm de casos reais enfrentados durante meu trabalho como engenheiro de software
Se você gostou do curso ou o achou útil , adicione uma estrela
CAPÍTULOS
# | TÍTULO | FOCO PRINCIPAL |
---|
1 | Introdução (html) | História do C/C++, Áreas de aplicação, Introdução ao curso |
2 | Preparação (html) | Livros, Como compilar, Olá mundo |
3 | Conceitos Básicos I (html) | Sistema de tipos, tipos fundamentais e operadores |
4 | Conceitos Básicos II (html) | Tipos integrais e de ponto flutuante e sua aritmética |
5 | Conceitos Básicos III (html) | Entidades, enumeradores, estruturas, instruções de fluxo de controle |
6 | Conceitos Básicos IV (html) | Heap, pilha, ponteiros, referências, propriedades Const, operadores de conversão |
7 | Conceitos Básicos V (html) | Funções, expressões lambda, diretivas de pré-processamento |
8 | Programação Orientada a Objetos I (html) | Hierarquia de classes, construtor, destruidor, palavras-chave de classe |
9 | Programação Orientada a Objetos II (html) | Polimorfismo, sobrecarga de operadores |
10 | Templates e Metaprogramação I (html) | Modelo de função, características de tipo, utilitários de tempo de compilação |
11 | Templates e Metaprogramação II (html) | Modelo de aula, SFINAE |
12 | Unidades de Tradução I (html) | Regra de ligação e uma definição |
13 | Unidades de Tradução II (html) | Lidando com múltiplas unidades e arquivos de tradução, #include , Módulos |
14 | Convenções de código I (html) | Organização do projeto, introdução às convenções de código, convenções de entidades |
15 | Convenções de código II (html) | Convenções de modelo, namespace, c++ moderno, capacidade de manutenção, nomenclatura e formatação |
16 | Depuração e teste (html) | Depuração de execução/memória, Sanitizadores, Técnicas de Harding, Teste unitário, Desenvolvimento orientado a testes |
17 | Ecossistema (html) | Cmake, documentação e outras ferramentas |
18 | Utilitários (html) | Principais bibliotecas std |
19 | Contêineres, iteradores e algoritmos (html) | Contêineres, Iteradores, Algoritmos, Intervalos |
20 | Tópicos Avançados I (html) | Semântica de movimento, referência universal, dedução de tipo |
21 | Tópicos Avançados II (html) | Tratamento de erros, expressões idiomáticas C++, ponteiros inteligentes |
22 | Otimizações de desempenho I (html) | Lei Ahmdal, limites de desempenho, conceitos de arquitetura (ILP, SIMD, etc.), hierarquia de memória |
23 | Otimizações de desempenho II (html) | Otimizações aritméticas, otimizações de memória, etc. |
24 | Otimizações de desempenho III (html) | Otimizações de compilador, criação de perfil e ferramentas de benchmarking |
25 | Design de Software I (html) | Conceitos básicos, princípios, casos de uso |
26 | Design de Software II (html) | Padrões de design e expressões idiomáticas |
LIVRO TUDO EM UM : modern-cpp.pdf (pode haver alguns commits atrás), html
TÓPICOS EM DETALHES
1. Introdução
- Um pouco de história das linguagens de programação C/C++
- Áreas de aplicação e popularidade
- Filosofia C++
- Fraqueza do C++ : alternativas do C++, por que mudar para uma nova linguagem é difícil?
- O curso
2. Preparação
- Livros e Referências
- Legenda do slide
- Qual editor/IDE/compilador devo usar?
- Como compilar?
- Olá mundo : fluxo de E/S
3. Conceitos Básicos I - Sistema de Tipos, Tipos Fundamentais e Operadores
- O sistema de tipos C++ : categorias de tipos, propriedades de tipos
- Visão geral dos tipos fundamentais de C++ : tipos aritméticos, sufixo e prefixo, tipos aritméticos não padrão, tipo
void
, nullptr
- Regras de conversão
- Palavra-chave
auto
- Operadores C++ : precedência de operadores, semântica de incremento/decremento de prefixo/postfix, operadores de atribuição, compostos e vírgula, operador de nave espacial
<=>
, operadores de comparação segura
4. Conceitos Básicos II – Tipos Integrais e de Ponto Flutuante
- Tipos de dados integrais : inteiros de largura fixa,
size_t
, ptrdiff_t
, uintptr_t
, semântica de operação aritmética, promoção, truncamento, comportamento indefinido, saturação aritmética - Tipos de ponto flutuante e aritmética : padrão de ponto flutuante IEEE e outras representações, valores normais/denormais, infinito, não um número (
NaN
), máquina Epsilon, unidades no último lugar (ULP), folha de dicas, limites e funções úteis, aritmética propriedades, comportamento de valores especiais, comportamento indefinido, detecção de erros de ponto flutuante - Problemas de ponto flutuante : cancelamento catastrófico, comparação de ponto flutuante
5. Conceitos Básicos III – Entidades e Fluxo de Controle
- Entidades
- Declaração e Definição
- Recenseadores
-
struct
, Bitfield, union
- Fluxo de controle : instrução
if
, loops for
e while
, loop for base for
intervalo, switch
, goto
, evitar aviso de variável não utilizada - Namespace : namespace global explícito, alias de namespace,
using
-declaração, using namespace
-directive, namespace inline
- Atributos :
[[nodiscard]]
, [[maybe_unused]]
, [[deprecated]]
, [[noreturn]]
6. Conceitos Básicos IV – Conceitos de Memória
- Ponteiros : operações de ponteiro, operador de endereço
&
, acesso de membro struct
, ponteiro void
, conversão de ponteiro, aritmética de ponteiro, ponteiros selvagens e pendentes - Heap e pilha : memória de pilha,
new
, delete
, alocação de posicionamento sem alocação, alocação sem lançamento, vazamento de memória - Inicialização : inicialização de variável, inicialização uniforme, inicialização de array, inicialização de estrutura, ligação de estrutura, inicialização de memória dinâmica
- Referências
- Expressões
Const
e Constantes : Contantes e literais, const
, constexpr
, consteval
, constinit
, if constexpr
, std::is constant evaluated()
, if consteval
- palavra-chave
volatile
- Conversão de tipo explícita :
static_cast
, const_cast
, reinterpret_cast
, trocadilho de tipo, std::bit_cast
, conversão de inicialização uniforme, gls::narrow_cast
- Operador
sizeof
: visão geral, [[no_unique_address]]
7. Conceitos Básicos V – Funções e Pré-processamento
- Funções : Passagem por valor, Passagem por ponteiro, Passagem por referência, Assinatura e sobrecarga de função, Sobrecarga e
=delete
, Parâmetros padrão - Ponteiro de função e objetos de função
- Expressões Lambda : lista de captura, expressão lambda e relação de função, notas de parâmetros, composição, recursão,
constexpr/consteval
, template
, mutable
, [[nodiscard]]
, lista de captura e classes - Pré-processamento : pré-processadores, erros comuns, macros de localização de origem, macros de compilação condicional, operador de stringização (
#
), #error
e #warning
, #pragma
, operador de colagem de token ##
, macro variádica
8. Programação Orientada a Objetos I – Conceitos de Classe
- Classes C++ : idioma RAII
- Hierarquia de classes
- Especificadores de acesso : especificadores de acesso de herança, quando usar
public/protected/private
para membros de dados? - Construtor de classe : construtor padrão, inicialização de classe, inicialização uniforme para objetos, construtor delegado, palavra-chave
explicit
, [[nodiscard]]
e classes - Copiar Construtor
- Destruidor de Classe
- Construtores, destruidores e operadores padrão (
= default
) - Palavras-chave de classe :
this
, static
, const
, mutable
, using
, friend
, delete
9. Programação Orientada a Objetos II - Polimorfismo e Sobrecarga de Operadores
- Polimorfismo : mecanismos C++ para polimorfismo, métodos
virtual
, tabela virtual, palavra-chave override
, palavra-chave final
, erros comuns, método virtual puro, classe abstrata e interface - Fundição de herança e identificação de tipo em tempo de execução
- Sobrecarga de operador : visão geral, operador de comparação
<
, operador de nave espacial <=>
, operador de subscrito []
, operador de subscrito multidimensional []
, operador de chamada de função ()
, operador estático []
e operador ()
, operador de conversão T()
, sobrecarga de tipo de retorno resolução, operadores de incremento e decremento ++
/ --
, operador de atribuição =
, operador de fluxo <<
, notas do operador - Layout de objeto C++ : agregado, classe trivial, classe de layout padrão, dados simples e antigos (POD), hierarquia
10. Templates e Metaprogramação I - Templates de Funções e Utilitários de Tempo de Compilação
- Modelo de função : visão geral, instanciação do modelo, parâmetros do modelo, parâmetro do modelo - valor padrão, sobrecarga, especialização
- Variável de modelo
- Tipos de parâmetros de modelo : notas de tipo genérico, espaço reservado
auto
, tipo de parâmetro de modelo de classe, tipos de array e ponteiro, tipo de função - Utilitários de tempo de compilação :
static_assert
, using
palavra-chave, palavra-chave decltype
- Características de tipo : visão geral, biblioteca de características de tipo, manipulação de tipo
11. Templates e Metaprogramação II - Templates de Classe e SFINAE
- Modelo de classe : especialização de classe, construtor de modelo de classe
- Dedução automática do modelo do construtor (CTAD)
- Modelo de classe - Conceitos avançados : Classe + Função - especialização, Nomes dependentes -
typename
e palavras-chave template
, Hierarquia de modelo de classe e using
, palavra-chave friend
, argumentos de modelo de modelo - Metaprogramação de modelo
- SFINAE: Falha na substituição não é um erro : Função SFINAE, classe SFINAE
- Modelo Variádico : Expressão dobrável, modelo de classe Variádico
- Conceitos C++ 20 : Visão geral, palavra-chave de
concept
, requires
cláusula, requires
expressão, requires
expressão + cláusula, requires
cláusula + expressão, requires
e constexpr
, requires
aninhado - Depuração de modelo
12. Unidades de Tradução I - Regra de Ligação e Uma Definição
- Conceitos Básicos : Unidade de tradução, Escopo local e global, Linkage
- Classe e duração de armazenamento : duração do armazenamento, classe de armazenamento, palavra-chave
static
, namespace anônimo, palavras-chave extern
- Ligação de
const
e constexpr
: fiasco da ordem de inicialização estática - Resumo de ligação
- Lidando com múltiplas unidades de tradução : classe em múltiplas unidades de tradução
- Regra de Uma Definição (ODR) : Problemas de variáveis globais, ODR - Ponto 3, funções/variáveis
inline
, constexpr
e inline
- ODR - Modelo de Função : Casos, palavra-chave
extern
- ODR - modelo de classe : casos, palavra-chave
extern
- Comportamento indefinido e resumo do ODR
13. Unidades de Tradução II - Incluir, Módulo e Namespace
-
#include
Problemas : Incluir guarda, Declaração de encaminhamento, Dependências circulares, Erros comuns de vinculação - Módulos C++20 : Visão geral, terminologia, visibilidade e acessibilidade, tipos de unidade de módulo, palavras-chave, fragmento de módulo global, fragmento de módulo privado, unidade de módulo de cabeçalho, partições de módulo
- Compilando múltiplas unidades de tradução : sinalizadores fundamentais do compilador, métodos de compilação
- Bibliotecas em C++ : biblioteca estática, construir bibliotecas estáticas, usar bibliotecas estáticas, biblioteca dinâmica, construir bibliotecas dinâmicas, usar bibliotecas dinâmicas, interface binária de aplicativo (ABI), desmantelar, encontrar dependências de bibliotecas dinâmicas, analisar objetos/símbolos executáveis
14. Convenções do Código I
- Organização do projeto C++ : diretórios do projeto, arquivos do projeto, notas de organização do projeto "comuns", alternativa - organização do projeto “canônica”
- Estilos e convenções de codificação : visão geral, estilos de codificação populares
- Arquivos de cabeçalho e
#include
: #include
guard, #include
sintaxe, ordem de #include
, Convenções comuns de cabeçalho/nome de arquivo de origem - Pré-processamento : macro, instruções de pré-processamento
- Variáveis : variáveis globais
static
, conversões - Recenseadores
- Tipos aritméticos : tipos integrais com sinal vs. sem sinal, conversão de tipos integrais, tipos integrais: tamanho e outros problemas, tipos de ponto flutuante
- Funções : parâmetros de função, argumentos de função, valores de retorno de função, especificadores de função, expressões lambda
- Estruturas e classes :
struct
vs class
, inicialização, listas de inicializadores reforçadas, funções de membro especiais, =default
, =delete
, outros problemas, herança, estilo
15. Convenções do Código II
-
auto
- Modelos e tipo de dedução
- Fluxo de controle : fluxo de controle redundante,
if/else
, comparação, switch
, for/while
- Namespace :
using namespace
, namespace anônimo/sem nome, namespace e design de classe, estilo - Recursos modernos do C++ : palavras-chave, recursos, classe, biblioteca
- Manutenção : compreensão de código, funções, modelo e depuração, biblioteca
- Portabilidade
- Nomenclatura : entidades, variáveis, funções, convenções de estilo, aplicação de estilos de nomenclatura
- Legibilidade e formatação : espaçamento horizontal, ponteiros/referências, espaçamento vertical, colchetes, decoradores de tipo, redução da verbosidade do código, outros problemas
- Documentação de código : documentação de função, sintaxe de comentário, documentação de arquivo
16. Depuração e teste
- Visão geral da depuração
- Asserções
- Depuração de execução : Breakpoints, Watchpoints / Catchpoints, Fluxo de controle, Pilha e informações, Imprimir, Desmontar,
std::breakpoint
- Depuração de memória :
valgrind
- Técnicas de proteção : uso de pilha, verificações de biblioteca padrão, proteções de comportamento indefinido, proteções de fluxo de controle
- Desinfetantes : Desinfetante de endereço, Desinfetante de vazamento, Desinfetante de memória, Desinfetante de comportamento indefinido, Desinfetante baseado em amostragem
- Resumo de depuração
- Avisos do compilador
- Análise Estática
- Teste de código : teste de unidade, desenvolvimento orientado a testes (TDD), cobertura de código, teste Fuzz
- Qualidade do código :
clang-tidy
17. Ecossistema - Cmake e outras ferramentas
- CMake :
cmake
e ctest
- Documentação de código :
doxygen
- Estatísticas de código : contagem de linhas de código, analisador de complexidade ciclomático
- Outras ferramentas : formatação de código -
clang-format
, Compiler Explorer
, transformação de código - CppInsights
, conclusão de código com tecnologia de IA - Pesquisa de código local - ugrep
, ripgrep
, hypergrep
, mecanismo de pesquisa de código - searchcode/grep.app
, benchmarking de código - Quick-Bench
, Fonte para codificação
18. Utilitários
- Fluxo de E/S : Manipulador,
ofstream/ifstream
- Strings :
std::string
, conversão de/para valores numéricos, std::string_view
, std::format
, std::print
- Visualizar :
std::span
- Bibliotecas matemáticas
- Número aleatório : conceitos básicos, C++
<random>
, semente, período e qualidade PRNG, distribuição, algoritmos recentes e desempenho, quase aleatório - Medição de tempo : hora do relógio de parede, hora do usuário, hora do sistema
- Modelos de classe padrão :
std::pair
, std::tuple
, std::variant
, std::optional
, std::any
, std::stacktrace
- Biblioteca do sistema de arquivos : métodos de consulta, métodos de modificação
19. Contêineres, Iteradores e Algoritmos
- Contêineres e Iteradores
- Contêineres de sequência :
std::array
, std::vector
, std::deque
, std::list
, std::forward_list
- Contêineres associativos :
std::set
, std::map
, std::multiset
- Adaptadores de contêiner :
std::stack
, std::queue
, std::priority_queue
- Implementar um Iterador Personalizado : Implementar um Iterador simples
- Notas do iterador :
- Métodos utilitários do iterador :
std::advance
, std::next
, std::prev
, std::distance
, métodos de acesso ao contêiner, características do iterador - Biblioteca de algoritmos :
std::find_if
, std::sort
, std::accumulate
, std::generate
, std::remove_if
- Intervalos C++20 : Conceitos-chave, visualização de intervalo, adaptador de intervalo, fábrica de intervalo, algoritmos de intervalo, ações de intervalo
20. Tópicos Avançados I
- Mover semântica : referências de
lvalues
e rvalues
, semântica de movimentação, std::move
, semântica de declaração de classe - Referência Universal e Encaminhamento Perfeito : Referência Universal, Regras de Recolhimento de Referência, Encaminhamento Perfeito
- Categorias de valor
-
&
, &&
Qualificadores de referência e sobrecarga volatile
- Copiar Elisão e RVO
- Dedução de tipo : passagem por referência, passagem por ponteiro, passagem por valor, dedução
auto
, auto(x)
: cópia de decaimento -
const
Correção
21. Tópicos Avançados II
- Comportamento indefinido: comportamento ilegal, comportamento específico da plataforma, comportamento não especificado, detecção de comportamento indefinido
- Tratamento de erros : tratamento de erros recuperáveis, código de retorno, exceções C++, definição de exceções personalizadas, palavra-chave
noexcept
, problemas de alocação de memória, código de retorno e resumo de exceção, std::expected
, abordagens alternativas de tratamento de erros - Ponteiros inteligentes :
std::unique_ptr
, std::shared_ptr
, std::weak_ptr
- Simultaneidade : métodos de thread, mutex, atômico, paralelismo baseado em tarefas
22. Otimização I – Conceitos Básicos
- Introdução : Lei de Moore, limitações da Lei de Moore, razões para otimização
- Conceitos Básicos : Complexidade assintótica, trade-off tempo-memória, ciclo de desenvolvimento, lei de Ahmdal, taxa de transferência, largura de banda, latência, limites de desempenho, intensidade aritmética
- Conceitos básicos de arquitetura : taxa de transferência de instruções (IPC), execução em ordem e fora de ordem, pipeline de instruções, paralelismo em nível de instrução (ILP), lei de Little, paralelismo em nível de dados (DLP) e instruções vetoriais (SIMD), Paralelismo em nível de thread (TLP), threads múltiplos de instrução única (SIMT), RISC, conjuntos de instruções CISC
- Hierarquia de memória : conceitos de hierarquia de memória, localidade de memória, latência núcleo a núcleo e afinidade de thread, modelo de ordenação de memória
23. Otimização II - Otimização de Código
- Operações de E/S :
printf
, E/S mapeada na memória, acelera o carregamento de dados brutos - Otimizações de memória : memória heap, memória stack, utilização de cache, alinhamento de dados, pré-busca de memória
- Tipos aritméticos : tipos de dados, operações aritméticas, conversão, ponto flutuante, funções intrínsecas do compilador, valor em um intervalo, tabela de pesquisa
- Fluxo de controle : ramificações, dicas de ramificação -
[[likely]]
/ [[unlikely]]
, inteiros assinados/não assinados, loops, elevação de loop, desenrolamento de loop, asserções, dicas do compilador [[assume]]/std::unreacheable()
, Recursão - Funções : custo de chamada de função, passagem de argumento, inlining de função, atributos de função, alias de ponteiros
- Programação Orientada a Objetos
- Biblioteca Std e outros aspectos do idioma
24. Otimização III - Otimizações sem codificação e benchmarking
- Otimizações do compilador : sobre o compilador, sinalizadores de otimização do compilador, sinalizadores de otimização de ponto flutuante, sinalizadores de otimização de vinculador, sinalizadores de arquitetura, ajudar o compilador a produzir código melhor, otimização guiada por perfil (PGO), otimizador binário de pós-processamento, otimizações poliédricas
- Técnicas de transformação do compilador : transformações básicas, descomutação de loop, fusão de loop, fissão de loop, intercâmbio de loop, ladrilho de loop
- Bibliotecas e estruturas de dados
- Benchmarking de desempenho : O que testar?, Qualidade da carga de trabalho/conjunto de dados, Comportamento do cache, Desempenho estável da CPU, Considerações sobre multithreads, Layout da memória do programa, Sobrecarga de medição, Otimizações do compilador, Avaliação de métricas
- Criação de perfil :
gprof
, uftrace
, callgrind
, cachegrind
, perf
Linux profiler - Computação Paralela : Simultaneidade vs. Paralelismo, Dimensionamento de Desempenho, Lei de Gustafson, Linguagens de Programação Paralelas
25. Design de Software I - Conceitos Básicos (DRAFT)
- Livros e Referências
- Conceitos Básicos : Abstração, interface e módulo, Classe Invariante
- Princípios de Design de Software : Separação de interesses, Baixo acoplamento, alta coesão, Encapsulamento e ocultação de informações, Design por contrato, Decomposição de problemas, Reutilização de código
- Complexidade de software : entropia de software, dívida técnica
- Os Princípios de Design SOLID
- Design de classe : O princípio da interface de classe, funções de membro versus funções livres, funções de namespace versus métodos estáticos de classe
- Estudo de caso BLAS GEMM
- Possuindo objetos e visualizações
- Valor vs. Semântica de Referência
- Variáveis Globais
26. Design de Software II - Padrões de Design e Idiomas (DRAFT)
- Idiomas C++ : Regra de Zero, Regra de Três, Regra de Cinco
- Padrão de design : Singleton, ponteiro para implementação (PIMPL), padrão de modelo curiosamente recorrente (CRTP), funções virtuais de modelo
Roteiro
- Melhore os capítulos de design de software
- Capítulo Aspectos de Construção (por exemplo, redução do tempo de construção)
Relatando erros? e contribuindo
Se você encontrar algum erro de digitação, erro conceitual ou seção que precise ser melhorada, informe-o usando o painel issue
.
Autor
Federico Busato
, https://federico-busato.github.io/
- LinkedIn: www.linkedin.com/in/federico-busato/
- Twitter: twitter.com/fedebusato