# Lista de exemplos de código C++

Esta é uma lista de exemplos de código C++, que demonstram a funcionalidade da linguagem e suas características.

## Programa mínimo

Este é um exemplo de um programa mínimo que faz nada. Ele começa sua execução e logo termina. A função main é definida como o ponto de início de qualquer programa C++.
* Notas com questões de compilador
* Ainda que o padrão C++ não exija return 0; na função main, alguns compiladores antigos como o Microsoft Visual C++ 6 retornam avisos ou erros com tal situação e podem não gerar código objeto correto.
O padrão C++ exige que main retorne o tipo de dado int (inteiro). Tradicionalmente, o valor do retorno dessa função representa o valor de retorno do próprio programa, o qual é informado para o processo que o executou. Um término mal sucedido pode ser indicado com um valor diferente de zero. O valor assumido por padrão é zero, que representa retorno bem sucedido.

## Programa Olá Mundo

Este é um exemplo do Programa Olá Mundo aplicado à linguagem C++ que utiliza a biblioteca padrão para a entrada e saída de dados.
* Notas com questões de compilador
* A adição da biblioteca padrão <ostream> pode ser necessária para alguns compiladores. Isto deve-se ao fato do padrão ISO C++ exigir que a biblioteca padrão <iostream> declare o objeto std::cout como uma instância da classe std::ostream, mas não obriga que <iostream> defina a classe std::ostream e seus operadores.
Nota-se no exemplo acima a declaração local de quais espaços de nomes estão sendo utilizados.

## Algoritmo de Trabb Pardo-Knuth

O código a seguir requer um compilador compatível com a revisão C++23:

## Gabaritos

Este é um exemplo da utilização de gabaritos para a substituição da seguinte macro de programação comumente utilizada em C, apesar de bastante insegura, para o retorno do maior entre dois elementos dados:

## Polimorfismo estático

Este é um exemplo de polimorfismo resolvido em tempo de compilação de código, representando a sobrecarga de funções.

## Polimorfismo dinâmico

Este é um exemplo de polimorfismo resolvido em tempo de execução de código, representando funções virtuais.

## Utilizando a biblioteca padrão

Este é um exemplo de programa que utiliza elementos da Standard Template Library.

## Busca de nomes dependente de argumento

O exemplo clássico de busca de nomes dependente de argumento, também chamada Koenig lookup, é mostrado abaixo:
Note que não foi necessário especificar o espaço de nomes da função f, ainda que ela foi encontrada devido à sua associação com a classe A utilizada como argumento.

## Tratamento de exceções

Abaixo é mostrado um exemplo do tratamento de exceções. A divisão de um inteiro por zero é uma operação inválida; como possui uma variável como divisor, a função div_ten_by deve primeiramente tratar casos inválidos de entrada. Caso a entrada seja zero, uma exceção será lançada, e o código será redirecionado para o tratamento da exceção (indicado por catch).

## Manipulação de argumentos da linha de comando

Uma necessidade comum aos desenvolvedores é a comparação de cadeias de caracteres passados pela linha de comando. Um exemplo de sua interpretação segue abaixo:
Diferente do restante de exemplos, notar que no exemplo acima a função main recebe argumentos em uma assinatura especial e que não pode ser alterada. É com esses parâmetros que o programa pode acessar as informações passadas pela linha de comando. O primeiro parâmetro passado indica a quantidade de parâmetros passados, e o segundo armazena uma cadeia de caracteres de cada parâmetro.

## Ambiguidade da linguagem

Abaixo é mostrado um exemplo de código que demonstra um tipo de ambiguidade na linguagem C++, mostrando porque um analisador sintático trivial não é o suficiente para gerar uma árvore de sintaxe. Apesar da cadeia de caracteres foo<1>(3) aparecer duas vezes no código, ela está empregada em situações bastante diferentes, e envolvendo identificadores diferentes. Na primeira situação o identificador foo é uma variável local da função teste1, cujo valor é comparado com o literal 1. O resultado é finalmente comparado com o literal 3. Na segunda situação, o identificador foo é a invocação de uma instância da função gabarito definida no início do código, alimentando o gabarito com literal 1 e alimentando o parâmetro da função com o literal 3.

## Metaprogramação com gabarito

Um exemplo difundido no cálculo de fatorial é o uso de recursividade, como demonstrado abaixo:
Note que no exemplo acima o cálculo é realizado em tempo de execução, o que implica que para cada chamada da função o processamento é feito novamente. É possível realizar tais cálculos recursivos em tempo de compilação através da metaprogramação com gabaritos, fazendo uso da especialização de gabaritos, com o seguinte código:
No exemplo acima, a metaprogramação com gabaritos permite a recursividade do gabarito, sendo que a condição de saída é dada pela especialização no valor literal "0". Para cada ocorrência de Factorial<4>::value no código fonte, o compilador realiza a chamada recursiva e substitui pelo resultado, 24. Em tempo de execução resta somente o valor literal, evitando o cálculo.