O Guia e Lista Definitiva de Livros C++

Esta pergunta tenta recolher as poucas pérolas entre as dezenas de maus livros em C++ que são publicados todos os anos.

Ao contrário de muitas outras linguagens de programação, que muitas vezes são pegas em viagem a partir de tutoriais encontrados na Internet, poucos são capazes de pegar C++ rapidamente sem estudar um livro C++ bem escrito. É muito grande e complexo para fazer isso. Na verdade, é tão grande e complexo, que ___ há muitos livros em C++ muito maus por aí. E nós não estamos falando de estilo ruim, mas de coisas como erros factuais glaringly óbvios do esporte e promoting abysmally bad programming styles.

Por favor, edite a resposta aceita para fornecer livros de qualidade e um nível de habilidade aproximado - _preferivelmente depois discutindo sua adição em a sala de bate-papo C++. (Os regulares podem impiedosamente desfazer o seu trabalho se discordarem de uma recomendação). Adicione um pequeno resumo/descrição sobre cada livro que você tenha lido/beneficiado pessoalmente. Sinta-se à vontade para debater a qualidade, títulos, etc. Os livros que preencherem os critérios serão adicionados à lista. Os livros que têm resenhas da Associação de Usuários C e C++ (ACCU) têm links para a resenha.

*Note: As FAQs e outros recursos podem ser encontrados em C++ tag info e em [tag:c++-faq].

Iniciante

Introdutório, sem experiência prévia de programação

  • C++ Primer * (Stanley Lippman, Josée Lajoie e Barbara E. Moo) (actualizado para C+++11) Vindo em 1k páginas, esta é uma introdução muito completa ao C++ que cobre quase tudo na língua, num formato muito acessível e com grande detalhe. A quinta edição (lançada em 16 de agosto de 2012) cobre C++11. [Revisão]
  • Programming: Principles and Practice Using C++](http://www.amazon.com/dp/0321992784/) (Bjarne Stroustrup, 2ª Edição - 25 de Maio de 2014) (actualizado para C++11/C+++14) Uma introdução à programação usando C++ pelo criador da linguagem. Uma boa leitura, que não pressupõe experiência prévia de programação, mas não é apenas para iniciantes.
  • Não confundir com C++ Primer Plus (Stephen Prata), com uma revisão significativamente menos favorável revisão.

Introdutório, com experiência prévia de programação

  • A Tour of C++ (Bjarne Stroustrup) (2ª edição para C++17) O "tour" é um rápido (cerca de 180 páginas e 14 capítulos) tutorial com uma visão geral de todos os C++ padrão (linguagem e biblioteca padrão, **e usando C++11***) a um nível moderadamente alto para pessoas que já conhecem C++ ou pelo menos são programadores experientes. Este livro é uma versão estendida do material que constitui os Capítulos 2-5 da Linguagem de Programação C++, 4ª edição.

  • Accelerated C++ (Andrew Koenig e Barbara Moo, 1ª edição - 24 de agosto de 2000) Isto basicamente cobre o mesmo terreno que o C++ Primer, mas o faz em um quarto de seu espaço. Isto é em grande parte porque não tenta ser uma introdução à programação, mas uma introdução ao C++ para pessoas que já programaram anteriormente em alguma outra língua. Tem uma curva de aprendizagem mais acentuada, mas, para aqueles que conseguem lidar com isto, é uma introdução muito compacta à língua. (Historicamente, ele rompeu um novo caminho ao ser o primeiro livro para iniciantes a usar uma abordagem moderna para o ensino da língua). Apesar disso, o C++ ensina é puramente C++98. [Revisão]

    Melhores práticas

  • (http://www.amazon.com/dp/0321334876/) (Scott Meyers, 3ª Edição - 22 de maio de 2005) Este foi escrito com o objetivo de ser o melhor segundo livro que os programadores de C+++ deveriam ler, e foi bem sucedido. As edições anteriores eram destinadas a programadores vindos de C, a terceira edição muda isso e tem como alvo programadores vindos de linguagens como Java. Ele apresenta ~50 regras de fácil memorização, juntamente com sua lógica, em um estilo muito acessível (e agradável). Para C++11 e C++14 os exemplos e algumas edições estão desatualizados e C+++ Moderno Eficaz deve ser preferido. [Revisão]

  • Esta é basicamente a nova versão de Effective C+++, destinada aos programadores C+++ que fazem a transição de C+++03 para C+++11 e C+++14.

  • Effective STL (Scott Meyers) Isto pretende fazer o mesmo com a parte da biblioteca padrão proveniente do STL que Effective C++ fez com a linguagem como um todo: Apresenta as regras básicas juntamente com a sua fundamentação. [Revisão]

    Intermediário

  • Mais Efetivo C++ (Scott Meyers) Ainda mais regras do polegar que Efetivo C++. Não tão importantes como as do primeiro livro, mas ainda assim é bom saber.

  • (http://www.amazon.com/dp/0201615622/) (Herb Sutter) Apresentado como um conjunto de quebra-cabeças, este tem uma das melhores e mais completas discussões sobre o gerenciamento adequado de recursos e segurança de exceções em C++ através da Aquisição de Recursos é a Inicialização (RAII), além de uma cobertura profunda de uma variedade de outros tópicos, incluindo o idioma pimpl, busca de nomes, bom design de classe e o modelo de memória C++. [Revisão]

  • (Herb Sutter) Cobre tópicos adicionais de segurança de exceção não cobertos em Excepcional C++, além de discussão de programação orientada a objetos em C++ e uso correto do STL. [Revisão]

  • (http://www.amazon.com/dp/0201760428/) (Herb Sutter) Discute programação genérica, otimização e gerenciamento de recursos; este livro também tem uma excelente exposição de como escrever código modular em C++ usando funções de não-membros e o princípio da responsabilidade única. [Revisão]

  • C++ Padrões de codificação (Herb Sutter e Andrei Alexandrescu) "Padrões de codificação" aqui não significa "quantos espaços devo indentar o meu código?" Este livro contém 101 melhores práticas, expressões idiomáticas e armadilhas comuns que podem ajudá-lo a escrever um código C++ correto, compreensível e eficiente. [Revisão]

  • (http://www.amazon.com/dp/0201734842/) (David Vandevoorde e Nicolai M. Josuttis) Este é o livro sobre templates como eles existiam antes de C++11. Ele cobre tudo desde o básico até algumas das mais avançadas metaprogramações de templates e explica cada detalhe de como os templates funcionam (tanto conceitualmente quanto na forma como são implementados) e discute muitas armadilhas comuns. Tem excelentes resumos da Regra de Definição Única (ODR) e resolução de sobrecarga nos apêndices. Uma segunda edição cobrindo C++11, C++14 e C++17 já foi publicada. [Revisão]

  • C++ 17 - O Guia Completo (Nicolai M. Josuttis) Este livro descreve todas as novas funcionalidades introduzidas no Padrão C++17 cobrindo tudo desde as simples 'Inline Variables', 'constexpr if' até 'Polymorphic Memory Resources' e 'New and Delete with overaligned Data'.

    Avançado

  • Modern C++ Design (Andrei Alexandrescu) Um livro pioneiro sobre técnicas avançadas de programação genérica. Introduz o design baseado em políticas, listas de tipos e expressões fundamentais de programação genérica e explica quantos padrões de design úteis (incluindo pequenos alocadores de objetos, functores, fábricas, visitantes e multi-métodos) podem ser implementados de forma eficiente, modular e limpa usando programação genérica. [Revisão]

  • C++ Metaprogramação de Modelos (David Abrahams e Aleksey Gurtovoy)

  • C++ Concurrency In Action (Anthony Williams) Um livro que cobre o suporte à concorrência C++11, incluindo a biblioteca de tópicos, a biblioteca atômica, o modelo de memória C++, fechaduras e mutexes, bem como questões de design e depuração de aplicações multithreaded. Uma segunda edição cobrindo C++14 e C++17 já foi publicada.

  • Advanced C++ Metaprogramming (Davide Di Gennaro) Um manual pré-C++11 de técnicas TMP, focado mais na prática do que na teoria. Há uma tonelada de trechos neste livro, alguns dos quais são tornados obsoletos por traços de tipo, mas as técnicas, no entanto, são úteis para conhecer. Se você puder suportar a formatação/edição peculiar, é mais fácil de ler do que Alexandrescu, e, sem dúvida, mais gratificante. Para desenvolvedores mais experientes, há uma boa chance de você pegar algo sobre um canto escuro de C++ (um quirk) que normalmente só acontece através de uma vasta experiência.

    Estilo de referência - Todos os níveis

  • A Linguagem de Programação C++ (Bjarne Stroustrup) (actualizado para C+++11) A clássica introdução ao C++ pelo seu criador. Escrita em paralelo com a clássica K&R, esta realmente lê-se muito parecida e cobre praticamente tudo, desde a linguagem central até a biblioteca padrão, passando pelos paradigmas de programação até a filosofia da linguagem. [Revisão] Nota: Todos os lançamentos do padrão C++ são rastreados nesta questão: Onde posso encontrar o padrão C++ atual.

  • C++ Tutorial e Referência da Biblioteca Standard (Nicolai Josuttis) (actualizado para C+++11) A introdução e referência para a Biblioteca Standard C++. A segunda edição (lançada em 9 de abril de 2012) cobre o C++11. [Revisão]

  • (http://www.amazon.com/dp/0201183951) (Angelika Langer e Klaus Kreft) Há muito pouco a dizer sobre este livro, exceto que, se você quiser saber alguma coisa sobre riachos e locais, então este é o único lugar para encontrar respostas definitivas. [Revisão] C+++11/14/17/... Referências:

  • O C++11/14/17 Standard (INCITS/ISO/IEC 14882:2011/2014/2017)_ Este, naturalmente, é o árbitro final de tudo o que é ou não é C++. Esteja ciente, no entanto, de que ele pretende ser apenas uma referência para usuários experientes dispostos a dedicar tempo e esforço consideráveis à sua compreensão. O padrão C++17 é lançado em formato eletrônico para 198 Francos Suíços.

  • A norma C+++17 está disponível, mas aparentemente não numa forma económica - directamente da ISO custa 198 Francos Suíços (cerca de $200 US). Para a maioria das pessoas, o esboço final antes da padronização é mais do que adequado (e gratuito). Muitos preferem um rascunho ainda mais recente, documentando novos recursos que provavelmente serão incluídos no C++20.

  • Overvisão do Novo C++ (C++11/14) (apenas PDF) (Scott Meyers) (actualizado para C++14) Estes são os materiais de apresentação (slides e algumas notas de palestra) de um curso de treinamento de três dias oferecido por Scott Meyers, que é um autor altamente respeitado em C++. Embora a lista de itens seja curta, a qualidade é alta.

  • As C+++ Diretrizes Essenciais (C++11/14/17/...) (editado por Bjarne Stroustrup e Herb Sutter) é um documento online em evolução que consiste em um conjunto de diretrizes para o uso do poço C++ moderno. As diretrizes estão focadas em questões de nível relativamente mais alto, tais como interfaces, gerenciamento de recursos, gerenciamento de memória e concorrência que afetam a arquitetura da aplicação e o design da biblioteca. O projeto foi anunciado na CppCon'15 por Bjarne Stroustrup e outros e recebe contribuições da comunidade. A maioria das diretrizes é complementada com uma fundamentação e exemplos, assim como discussões sobre possíveis ferramentas de suporte. Muitas regras são projetadas especificamente para serem verificadas automaticamente por ferramentas de análise estática.

  • O C++ Super-FAQ (Marshall Cline, Bjarne Stroustrup e outros) é um esforço da Fundação Standard C++ para unificar as FAQs C++ anteriormente mantidas individualmente pela Marshall Cline e Bjarne Stroustrup e também incorporando novas contribuições. Os itens tratam principalmente de questões de nível intermediário e são frequentemente escritos com um tom humorístico. Nem todos os itens podem estar totalmente atualizados com a última edição do padrão C++ ainda.

  • cppreference.com (C+++03/11/14/17/...) (iniciado por Nate Kohl) é um wiki que resume as características básicas do idioma base e tem uma extensa documentação da biblioteca padrão C++. A documentação é muito precisa, mas é mais fácil de ler do que o documento padrão oficial e fornece uma melhor navegação devido à sua natureza wiki. O projeto documenta todas as versões do padrão C++ e o site permite filtrar a exibição para uma versão específica. O projeto foi apresentado por Nate Kohl na CppCon'14.

    Clássicos / Antigos

    Nota: Algumas informações contidas nestes livros podem não estar atualizadas ou não serem mais consideradas melhores práticas.

  • The Design and Evolution of C++ (Bjarne Stroustrup) Se você quer saber porquê a linguagem é do jeito que é, este livro é onde você encontra respostas. Isto cobre tudo antes da padronização do C++.

  • Ruminations on C++ - (Andrew Koenig e Barbara Moo) [Revisão]

  • (http://www.amazon.com/dp/0201548550/) (James Coplien) Um predecessor do movimento padrão, descreve muitas "expressões idiomáticas" específicas do C++. É certamente um livro muito bom e ainda pode valer a pena ser lido se você puder dispensar o tempo, mas bastante antigo e não atualizado com o C++ atual.

  • Large Scale C++ Software Design (John Lakos) Lakos explica técnicas para gerenciar projetos de software C++ muito grandes. Certamente, uma boa leitura, se estivesse apenas atualizada. Ele foi escrito muito antes do C++ 98 e falha em muitos recursos (por exemplo, namespaces) importantes para projetos de grande escala. Se você precisa trabalhar em um grande projeto de software C++, você pode querer lê-lo, embora você precise levar mais do que um grão de sal com ele. O primeiro volume de uma nova edição é esperado em 2019.

  • Se você quiser saber como as funções dos membros virtuais são comumente implementadas e como os objetos base são comumente dispostos em memória em um cenário de multi-heritância, e como tudo isso afeta o desempenho, é aqui que você encontrará discussões detalhadas sobre tais tópicos.

  • Manual de Referência Anotado C++_](https://www.amazon.com/Annotated-C-Reference-Manual/dp/0201514591) (Bjarne Stroustrup, Margaret A. Ellis) Este livro está bastante desatualizado no fato de que ele explora a versão C++ 2.0 de 1989 - Modelos, exceções, namespaces e novos casts ainda não foram introduzidos. Dizendo que, no entanto, este livro percorre todo o padrão C++ da época explicando a lógica, as possíveis implementações, e as características da linguagem. Este não é um livro para aprender princípios e padrões de programação em C++, mas para compreender todos os aspectos da linguagem C++.

  • Pensando em C++](http://www.amazon.com/dp/0139798099/) (Bruce Eckel, 2ª Edição, 2000). Dois volumes; é um conjunto tutorial estilo livre de livros de nível introdutório. Downloads: vol 1, vol 2. Infelizmente eles’são manchados por uma série de erros triviais (por exemplo, manter que os temporários são automaticamente `const'), sem uma lista oficial de erratas. Uma lista de erratas parcial 3rd party errata list está disponível em (http://www.computersciencelab.com/Eckel.htm), mas ela’s aparentemente não é mantida.

  • Cientifico e Engenharia C++: An Introduction to Advanced Techniques and Examples](https://www.amazon.com/Scientific-Engineering-Introduction-Advanced-Techniques/dp/0201533936) (John Barton e Lee Nackman) É um livro abrangente e muito detalhado que tentou explicar e fazer uso de todas as funcionalidades disponíveis em C++, no contexto dos métodos numéricos. Ele introduziu na época várias novas técnicas, como o Curiosamente Recorrente Padrão de Modelo (CRTP, também chamado de truque Barton-Nackman). Foi pioneiro em várias técnicas, como a análise dimensional e a diferenciação automática. Veio com muito código compilável e útil, desde um analisador de expressões até uma embalagem Lapack. O código ainda está disponível aqui: http://www.informit.com/store/scientific-and-engineering-c-plus-plus-an-introduction-9780201533934. Infelizmente, os livros tornaram-se um pouco ultrapassados no estilo e características do C++, no entanto, foi um tour-de-force incrível na época (1994, pré-STL). Os capítulos sobre herança dinâmica são um pouco complicados de entender e não muito úteis. Uma versão atualizada deste livro clássico que inclui a semântica do movimento e as lições aprendidas com o STL seria muito agradável.

Comentários (22)