Compartilhar via


Bem-vindo ao C++ (C++ moderno)

A C++ é uma das linguagens de programação mais usadas do mundo e os programas bem escritos que a utilizam são rápidos e eficientes. Essa linguagem é mais flexível que as demais porque é possível usá-la para criar diversos aplicativos, desde jogos divertidos e envolventes a softwares científicos de alto desempenho, drivers de dispositivos, programas incorporados e aplicativos clientes do Windows. Há mais de 20 anos, C++ é usada para solucionar problemas como esses e de muitos outros tipos. Mas talvez você ainda não saiba que cada vez mais programadores C++ estão deixando a programação C para trás e usando a moderna linguagem C++ em seu lugar.

Um dos requisitos originais da C++ é a compatibilidade com as versões anteriores da linguagem C. Com isso, a linguagem C++ passou por diversas iterações — C com classes, especificações da linguagem C++ original e muitas outras melhorias. Por causa dessa herança, a linguagem C++ muitas vezes é chamada de linguagem de programação multiparadigma. Com a C++, você pode deixar a programação estritamente processual em estilo C que envolve ponteiros brutos, matrizes, cadeias de caracteres com terminação nula, estruturas de dados personalizadas e outros recursos que podem garantir um desempenho ótimo, mas que também geram muitos bugs e aumentam a complexidade. Como a programação em C vem acompanhada de todos esses riscos, um dos principais objetivos da linguagem C++ era possibilitar a criação de programas fortemente tipados, fáceis de gravar, ampliar e manter. No início, a linguagem C++ adotou paradigmas de programação como a programação orientada a objetos. Com os anos, outros recursos foram adicionados à linguagem com bibliotecas padrão de estruturas de dados e algoritmos altamente testados. Foram essas adições que possibilitaram o estilo C++ moderno.

Destaques do C++ moderno:

  • Escopo baseado em heap, em vez de escopo global estático ou heap.

  • Dedução de tipo, em vez de nomes de tipo explícitos.

  • Ponteiros inteligentes, em vez de ponteiros duplos.

  • Os tipos std::string e std::wstring (consulte <string>), em vez de matrizes char[] brutas.

  • Contêineres de STL (Biblioteca de modelos padrão), como vector, list e map, em vez de matrizes brutas ou contêineres personalizados. Consulte <vector>, <list> e <map>.

  • Algoritmos STL, em vez de algoritmos codificados manualmente.

  • Exceções para relatar e lidar com condições de erro.

  • Comunicação inter-thread sem bloqueio, com uso de STL std::atomic<> (consulte <atomic>), em vez de outros mecanismos de comunicação inter-thread.

  • Funções lambda embutidas, em vez de pequenas funções implementadas separadamente.

  • Loops com base em intervalos para gravar loops mais robustos que funcionam com matrizes, contêineres STL e coleções Tempo de Execução do Windows no formato for ( for-range-declaration : expression ). Isso faz parte do suporte à linguagem base. Para obter mais informações, consulte Instrução for com base em intervalo (C++).

A linguagem C++ também evoluiu. Compare os trechos de código a seguir. Este trecho mostra como a linguagem C++ era antigamente:

// circle and shape are user-defined types
circle* p = new circle( 42 ); 
vector<shape*> v = load_shapes();

for( vector<circle*>::iterator i = v.begin(); i != v.end(); ++i ) {
    if( *i && **i == *p )
        cout << **i << “ is a match\n”;
}

for( vector<circle*>::iterator i = v.begin();
        i != v.end(); ++i ) {
    delete *i; // not exception safe
}

delete p;

Veja o mesmo código com a linguagem C++ moderna:

#include <memory>
#include <vector>
// ...
// circle and shape are user-defined types
auto p = make_shared<circle>( 42 );
vector<shared_ptr<shape>> v = load_shapes();

for_each( begin(v), end(v), [&]( const shared_ptr<shape>& s ) {
    if( s && *s == *p )
        cout << *s << " is a match\n";
} );

Na linguagem C++ moderna, você não precisa usar novos tratamentos de exceções nem excluí-los, pois é possível usar ponteiros inteligentes. Ao usar a dedução do tipo auto e a função lambda, você pode escrever os códigos com mais rapidez, ajustá-los e compreendê-los melhor. Além disso, for_each fica mais simples, mais fácil de usar e menos propenso a erros acidentais do que os loopsfor. Você pode usar texto clichê com linhas de código mínimas para gravar seu aplicativo. Você também pode fazer com que o código seja à prova de exceções e memória e que ele não precise lidar com alocação/desalocação ou códigos de erros.

A linguagem C++ moderna incorpora dois tipos de poliformismo: tempo de compilação, por meio de modelos, e tempo de execução, por meio de herança e virtualização. É possível combinar esses dois tipos de poliformismo para melhorar a eficiência. O modelo STL shared_ptr usa métodos virtuais internos para eliminar o tipo aparentemente sem esforços. Porém, não use a virtualização em excesso no poliformismo quando um modelo for a melhor opção. Os modelos podem ser muito úteis.

Se está migrando de outra linguagem para C++, principalmente de uma linguagem gerenciada em que a maioria dos tipos é de referência e poucos são de valor, você precisa saber que as classes C++ são tipos de valor por padrão. No entanto, você pode especificá-los como tipos de referência para habilitar o comportamento polimórfico que possibilita usar a programação orientada a objetos. Uma perspectiva útil: os tipos de valor estão mais relacionados à memória e ao controle de layouts. Já os tipos de referência estão mais relacionados às classes básicas e funções virtuais para possibilitar o uso de poliformismo. Por padrão, os tipos de valor podem ser copiados. Cada um deles tem um construtor de cópia ou operador de atribuição de cópia. Ao especificar um tipo de referência, desabilite a funcionalidade de cópia das classes, o construtor de cópia e o operador de atribuição de cópia, e use um destruidor virtual, que é compatível com poliformismo. Os tipos de valor também estão relacionados ao conteúdo que, quando copiado, gera dois valores independentes, que podem ser modificados separadamente. Porém, os tipos de referência estão relacionados à identidade: o tipo de objeto. Por isso, esses tipos também são chamados de polimórficos.

A C++ está passando por uma renovação porque a potência voltou a ser essencial. Linguagens como Java e C# são úteis quando a produtividade do programador é um aspecto importante. Contudo, elas têm suas limitações quando potência e desempenho são essenciais. Para obter alta eficiência e potência, principalmente em dispositivos com hardware limitado, não há páreo para a linguagem C++.

Além de a linhagem ser moderna, as ferramentas de desenvolvimento também são. Com o Visual Studio, todas as etapas do ciclo de desenvolvimento ficam robustas e eficientes. Ele conta com ferramentas de ALM (Gerenciamento de ciclo de vida de aplicativos), melhorias de IDE, como IntelliSense, mecanismos úteis para ferramentas, como XAML, e ferramentas de compilação, depuração e muitas outras.

Os artigos da documentação sobre esse assunto fornecem diretrizes de alto nível e melhores práticas para os recursos e as técnicas mais importantes para gravar programas C++ modernos.

Para obter mais informações, consulte o artigo da StackOverflow, Quais idiomas C++ foram preteridos no C++11.

Consulte também

Referência

Expressões lambda em C++

Outros recursos

Referência de linguagem C++

Referência da Biblioteca Padrão C++