> For the complete documentation index, see [llms.txt](https://stacked-rwx.gitbook.io/public/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://stacked-rwx.gitbook.io/public/programming/melhores-praticas-para-programacao-em-c++.md).

# Melhores práticas para programação em C++

\- ***Evite o “using namespace”***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*KBB9ix47DJ0UoDzeZb9BAg.png" alt="" height="113" width="700"><figcaption></figcaption></figure>

* A instrução que usa o ***namespace std*** é geralmente considerada uma prática inadequada. A alternativa a essa instrução é especificar o namespace ao qual o identificador pertence usando o operador de escopo (: :) cada vez que declaramos um tipo.\
  Embora a instrução evite digitar *std ::* sempre que desejarmos acessar uma classe ou tipo definido no namespace std, ela importa todo o namespace **std** para o namespace atual do programa.

***- Evite usar o “std::endl”***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*f1OsbHxDU_KOpCfhQ3mPbg.png" alt="" height="128" width="700"><figcaption></figcaption></figure>

* É uma prática comum usar **std::endl** para imprimir novas linhas ao usar cout. Para programas pequenos com muito poucas operações de E / S, essa prática é aceitável, mas se a maior parte das operações de E / S aumentar, a eficiência do programa ficará comprometida.\
  \
  **std::endl** não apenas adiciona novas linhas ao fluxo, mas também libera o buffer cada vez que é usado. Assim, quando escrevemos:

```cpp
std::cout << std::endl;
```

Na verdade estamos fazendo algo assim:

```cpp
 std::cout << '\n' << std::flush;
```

A liberação de buffers é uma tarefa do sistema operacional. Cada vez que o buffer é liberado, uma solicitação deve ser feita ao sistema operacional e essas requests são comparativamente caras. Escrever ‘\ n’ caracteres diretamente no stream é mais eficiente, pois não força um flush como std::endl.

***- Use sempre {chaves} para tornar blocos explícitos***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*anJzVvMxAkW3wfxOUIZhJg.png" alt="" height="173" width="700"><figcaption></figcaption></figure>

* Isso gera problemas de semântica e é considerado uma boa prática para tornar o seu código mais legível. Essa é uma prática bastante usada no Python, pois não utiliza-se chaves em funções de if, else, for, while e etc.

***- Inicializar variáveis de membro com : ()***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*tlELBzBGvI51v0hxg1tNmA.png" alt="" height="142" width="700"><figcaption></figcaption></figure>

* Essa prática, além de deixar seu código com melhor desempenho, ele também fica menor e de fácil entendimento.

***- Prefira {} para inicialização, do que =***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*5PQHFomN4rQ_pMhKnirCaA.png" alt="" height="110" width="700"><figcaption></figcaption></figure>

* Isso facilita o trabalho do compilador e evita falha ao inicializar o membro ou variável.

***- Prefira o std::size\_t***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*F5gLILlw-vpNefO0FdGGpA.png" alt="" height="59" width="700"><figcaption></figcaption></figure>

* Diversas vezes precisamos utilizar algum membro ou variável para fazer comparação. Quando isso é feito com elementos de um vetor, o compilador emitirá diversos alertas, porque sua comparação é inválida. Isso pode resultar até em perdas de dados.

***- Use .hpp e .cpp para suas extensões de arquivos C++***

* O uso de .cc e .h fogem totalmente dos padrões da programação C++, já que normalmente são utilizados na programação C.

***- Faça uso excessivo de \&referências e \*ponteiros***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*U5LbojzpFfEwIiTR2zaahA.png" alt="" height="168" width="700"><figcaption></figcaption></figure>

* Sempre que puder, faça uso excessivos de referências e ponteiros.

***- Use ponteiros inteligentes***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*bUNMhd89gh2HBLKisUkRMA.png" alt="" height="160" width="700"><figcaption></figcaption></figure>

* Isso evita vazamento de memória e erros inesperados.

***- Não use arrays, crie listas com std::arrays ou std::vector***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*RPCuRJjrOdkeOMdfz-s2bw.png" alt="" height="114" width="700"><figcaption></figcaption></figure>

* Ambos garante o layout de memória contígua de objetos e devem substituir o uso de arrays no estilo C.

***- Use a conversão no estilo C++***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*SxNf9WZ3jVDaGPP9v5VUSA.png" alt="" height="86" width="700"><figcaption></figcaption></figure>

* A conversão no estilo C++ permite mais verifcações do compilador. Além disso, o estilo de conversão C++ é mais visível e há mais possibiblidades de fazer pesquisas.

***- Não use macros***

<figure><img src="https://miro.medium.com/v2/resize:fit:700/1*tU_o8_Wi7NxkBAznR5UtlQ.png" alt="" height="63" width="700"><figcaption></figcaption></figure>

* Não use macros! Use constantes como const. Não é possível debugar macros, mesmo usando os parametros -g, -a e -error em conjunto.

### Esse daqui foi mais um artigo no qual tive base nos ensino do canal do Terminal Root. Resolvi repassar tudo o que aprendi sobre boas práticas na programação C++. Vejo vocês no próximo artigo! <a href="#b335" id="b335"></a>
