Muito do conteúdo que vou postar aqui baseia-se nos recursos do C++11, então é natural começar falando um pouco desta nova versão da linguagem. O C++ é uma linguagem cuja evolução não é decidida por uma empresa, mas sim de forma democrática por um comitê internacional. Por estes e outros motivos, a evolução da linguagem é lenta.
Quando o C++ foi criado, no início dos anos 80 por Bjarne Stroustrup, o padrão de facto da linguagem era o seu livro "The C++ Programming Language". A partir dos anos 90 houve a preocupação em padronizar formalmente e internacionalmente a linguagem. Assim surgiram os padrões ISO/IEC para as versões C++98 (1998), C++03 (2003) e mais recentemente o C++11 (foi chamado por muito tempo de C++0x pois se esperava estar concluído ainda nos anos 200x). Este é atual padrão da linguagem C++, aprovado pelo comitê em agosto de 2011 e publicado pela ISO em set/2011 (ISO/IEC 14882:2011). Agora em 2014 foi feita uma revisão (informalmente C++14), já aprovada pelo comitê mas ainda não publicada até a presente data. A próxima grande atualização prevista é o C++17.
Onde conhecer C++11?
O documento oficial da versão atual da linguagem é o ISO/IEC 14882:2011. Como acontece com normas ISO, o documento é pago. A ABNT vende no Brasil por R$ 666,40. O draft final redigido pelo comitê está gratuitamente disponível em http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf.Deve ser o mesmo conteúdo da versão paga (não a garantia disto), mas sem formatação. De qualquer forma, não é um documento para estudar ou aprender (a não ser como estudo de caso para uma cadeira de Linguagens Formais ou Compiladores!). Também não é um documento que apresente apenas as diferenças do C++11 para a versão anterior. Este é o atual standard, então toda a linguagem está descrita.
Principais fontes de pesquisa que eu usei/uso para pesquisa (random_shuffle'd):
- A FAQ do Stroustrup;
- O site cplusplus.com, aliás, minha principal referência online para a biblioteca padrão;
- A edição atual do The C++ Programming Language. Ganhei um exemplar do meu aluno Natan Streppel. Valeu Natan! O livro é D+;
- O Google, como todo mundo, né!
Quais são as diferenças do C++03 para o C++11?
Um único post não é espaço adequado para relacionar, sem ser muito superficial, a evolução que ocorreu. Vamos fazer isto em doses homeopáticas. Quem está ansioso olha na FAQ do Stroustrup.
Mas aí vai um pequeno exemplo, que disponibilizei no Ideone.com, e que ilustra algumas poucas novidades :
O que aparece de novo aí?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iostream> #include <algorithm> #include <iterator> using namespace std; int main() { int a[] {10, 48, 57, 23, -1, 12}; cout << "Is sorted? " << boolalpha << is_sorted(begin(a), end(a)) << endl; sort(begin(a), end(a)); for(auto v : a) cout << v << '\n'; return 0; } |
O que aparece de novo aí?
- Forma universal de inicialização (linha 9). Percebam que não usei o sinal de atribuição (=);
- Função is_sorted (linha 13) e as funções begin() e end(), podendo ser usadas em arrays tradicionais (\0/) (linha 13 e 16);
- range-for (linha 17);
- Inferência de tipo (auto) (linha 17).
Vale a pena usar c++11?
Certamente. O principal ganho é em produtividade. Algumas coisas simples, como o range-for, que a maioria das linguagens já tinha e faltava no C++; a inferência de tipo; as expressões lambda; o alinhamento com o C99 e as novas funções e classes da biblioteca padrão (Lista simplesmente encadeada, tabela hash, classes mais aprimoradas para medir tempo do que a velha <time.h>, regex, geradores de números pseudo-aleatórios, para citar alguns exemplos) são muito úteis mesmo para um programador C++ básico/intermediário. Parte significativa da mudança será mais interessante para um programador que faça uso da Programação Orientada a Objetos e/ou Meta-programação por Templates mais a fundo.
Vale a pena migrar meu código para c++11?
Quem aí tem tempo para isto???? Não vejo necessidade em sair convertendo código legado. Só a (re)compilação, em alguns casos específicos, já pode dar algum ganho de desempenho. Principalmente onde a nova Move semantic, pode permitir ao RVO (Return value optimization) eliminar cópias desnecessárias de grandes objetos como em uma função que retorna um container (um list<T>, por exemplo).
A única quebra de compatibilidade que identifiquei foi a mudança de semântica da palavra reservada auto. Antes era um modificador de tipo que indicava que a variável teria alocação automática, isto é deveria ser armazenada na pilha. Agora serve para inferência de tipo (o compilador irá detectar o tipo para a variável com base no valor usado para inicializá-la). Então este código, que antes era válido, agora gera erro de compilação.
A única quebra de compatibilidade que identifiquei foi a mudança de semântica da palavra reservada auto. Antes era um modificador de tipo que indicava que a variável teria alocação automática, isto é deveria ser armazenada na pilha. Agora serve para inferência de tipo (o compilador irá detectar o tipo para a variável com base no valor usado para inicializá-la). Então este código, que antes era válido, agora gera erro de compilação.
1 | auto int x=0; |
Como compilar usando C++11?
Na linha de comando, basta incluir a flag -std=c++11 na chamada ao compilador g++g++ -std=c++11 programa.cpp -o programa
No Code::Blocks, basta ligar esta opção no menu Settings/Compiler/Compiler Settings:
Experimentem, explorem, divirtam-se. É assim que se deve (re)aprender programação!

Nenhum comentário:
Postar um comentário