C++: História e Versões

por Fabio A. Mazzarino

Semana passada falamos sobre a história e as versões da linguagem C, hoje vamos falar sobre C++. Assim como a linguagem C, muitos novatos acham que a linguagem C++ é desatualizada e pouco utilizada, mas não sabe que é uma das linguagens mais utilizadas do mundo, e peça chave no desenvolvimento de muitos softwares recentemente desenvolvidos.

C com Classes e C++

Incialmente concebida em 1979 por Bjarne Stroustrup, foi batizada simplesmente de C with Classes (C com Classes) enquanto trabalhava na AT&T, gigante americana de telecomunicações. Ainda faltavam muitas funcionalidades populares atualmente, mas incluía:

  • derivação de classes;
  • tipagem forte;
  • métodos inline;
  • argumentos padrão

Já em 1982 ele publica a linguagem C++. O nome vem do operador de incremento da linguagem C, indicando que a linguagem seria um incremento da já popular linguagem C. Nessa versão foram inclusas algumas novidades:

  • funções virtuais
  • sobrecarga de operadores
  • referências
  • constantes
  • new e delete
  • comentários de uma linha (//)

Em 1984 foi implementada a primeira versão do iostream. E em 1985 foi publicado a primeira edição do livro The C++ Programming Language, referência ao livro de 1978 The C Programming Language, que por muito tempo foi usado para definir o padrão da linguagem C. Ainda hoje disponível na 4a edição, de 2013, que inclui C++11, na Amazon.

C++ 2.0

Em 1989 foi liberada o C++ 2.0, seguido da publicação da segunda edição do The C++ Programming Language em 1991. Essa nova versão trouxe algumas novidades:

  • herança múltipla, e sua controvérsia;
  • classes abstratas;
  • métodos abstratos;
  • métodos const;
  • métodos e atributos protected.

Quem aprendeu C++ nos anos 90, aprendeu essa versão, que incluiu tardiamente algumas funcionalidades:

  • templates;
  • excessões;
  • namespace;
  • novos casts;
  • tipo bool.

C++98 e C++03

No final dos anos 90 houve um esforço para formalizar as linguagens C e C++, o resultado foi o padrão ISO/IEC 14882:1998, conhecido como C++98, formalizando a C++ 2.0. Em 2003 pequenas atualizações resultaram na ISO/IEC 14882:2003, também conhecido como C++03.

Tal qual implementado no começo dos anos 90 a linguagem C++ continuou praticamente sem modificações sigificativas até 2011, quando muitas mudanças foram implementadas.

C++11

Por 20 anos C++ foi suficiente, mas novas técnicas precisavam ser incorporadas à linguagem, e por isso em 2011 foi publicada a norma ISO/IEC 1488S:2011, conhecida também por C++11. Por um tempo a versão foi conhecida por C0x, pois a expectativa era de ser lançada até 2009, mas a extensão das novas funcionalidades acabou adiando a publicação para 2011.

Esta nova versão trouxe grandes mudanças:

  • referências Rvalue;
  • constexpr;
  • templates externos;
  • inicializadores de lista e uniformes;
  • inferência de tipo;
  • loops com iteradores;
  • funções lambda ou anônimas;
  • sintaxe alternativa de declaração de funções e métodos;
  • melhoria nos construtores;
  • enums com tipagem forte;
  • conversor de tipo explícitos;
  • unions irrestritos;
  • templates com parâmetros variáveis;
  • novas constantes de string;
  • literais definidos por usuário;
  • controle de alinhamento de variáveis;
  • atualizações na STL;
  • melhorias no suporte a threads;
  • tuples e hash;
  • tipo tuple;
  • atualizações na STL;
  • expressões regulares;
  • novas funções de randomização;
  • metaprogramação;
  • dentre diversas outras novidades.

A lista é realmente extensa, e foram tantas e tão profundas que a utilização de C++11 passou a ser chamada de C++ moderno. Programadores que não se atualizaram nesse período acabaram por se ver desatualizados.

Mas a mudança foi pra melhor. A linguagem ficou mais poderosa e ao mesmo tempo mais prática. Muitas novas funcionalidades foram adicionadas à STL, ao mesmo tempo que as novas possibilidades da linguagem permitiu a implementação de bibliotecas muito práticas.

C++14

Em 2014 foi publicada a ISO/IEC 14882:2014, chamada de C++1y, ou C++14. Apesar de ser uma atualização menor trouxe algumas novas funcionalidades importantes:

  • dedução do tipo de retorno;
  • forma alternativa de declaração de tipo;
  • relaxamento de restrições de constexpr;
  • templates variáveis;
  • novos literais binários;
  • separadores de dígito;
  • lambdas genéricos;
  • expressões de captura de lambda
  • atributo [[deprecated]]
  • novas funções STL

C++17

Em 2017 foi publicada a ISO/IEC 14822:2017, também chamada de C++1z ou C++17. Esta versão teve algumas funcionalidades removidas, como o fim do modificador register, fim dos trígrafos e algumas funções da STL. Mas também contou com a adição das funcionalidades:

  • atributos para namespaces e enumerators;
  • typename em como parâmetro de template;
  • novos atributos [[fallthrough]], [[maybe_unused]] e [[nodiscard]];
  • literais de ponto flutuante em hexadecimal
  • inicializadores no if e switch;
  • variáveis inline;
  • especificação de exceções como parte da declaração de métodos.

C++20

Esta versão do C++, publicada sobre a ISO/IEC 14822:2020, também chamada de C++2a, foi publicada a cerca de um ano atrás, em Fev/2020. Apesar de já estar publicada, e alguns compiladores darem suporte experimental parcial, não há nenhum compilador comercialmente disponível capaz de suportar a especificação completamente.

Dentre as novas funcionalidades podemos citar:

  • módulos;
  • capturas lamba [=, this]
  • templates para lambdas
  • comparação de três vias (<=>)
  • lambda em contextos não avaliados
  • literais de string como parâmetros de template
  • novos atributos [[no_unique_address]], [[likely]] e [[unlikely]]
  • explicit condicional
  • consteval
  • coroutines
  • constinit

Além de diversas funcionalidades novas na STL.

Qual utilizar?

Muito cuidado ao selecionar qual versão utilizar. Escolher uma versão muito recente vai dificultar encontrar compiladores compatíveis, bem como profissionais capazes. Escolher uma versão muito antiga e funcionalidades importantes não serão suportadas.

Normalmente em produtos que tem um ciclo de entrega longo, que serão liberados muito adiante no tempo, necessariamente devem utilizar uma versão mais recente, enquanto que produtos com ciclo de entrega curto é mais recomendado utilizar versões nem tão recentes.

As versões mais utilizadas hoje são a C++03 e a C++11. As demais são opções de sistemas mais recentes e times de early adoptors. A versão C++20 está despontando como um expoente, mas a popularidade será definida somente com o tempo.