Dado que o C ++ '11 foi aprovado, isso muda Como um iniciante em C ++ aprende o idioma? [fechadas]

21

Eu queria aprender C ++ por um tempo e fiz AP Computer Programming na High School (quando era C ++ e não Java). Eu gosto de C e simplesmente não encontrei tempo para aprender C ++ ou voltarei a usar C # onde sou muito mais produtivo.

Minha pergunta é a seguinte: dado que o C ++ '11 foi aprovado (embora eu saiba que não esteja totalmente implementado) isso muda a maneira como devo abordar o aprendizado de C ++? Eu possuo C ++: The Complete Reference, de Herb Schildt, que é de 1998. O novo padrão aprovado torna menos importante o aprendizado de tais livros do que alguns dos novos tutoriais / livros que incluem itens do padrão? Existe algum benefício em aprender com os livros mais antigos?

Jetti
fonte
9
Oof. Schildt. Não posso falar da qualidade de seus materiais C ++, mas seus materiais C ficaram abaixo do padrão por um longo tempo (até a última edição do C: TCR ainda possui alguns erros não triviais). Eu recomendo procurar um trabalho mais atual de um autor diferente.
John Bode
O C ++ 11 não mudou os conceitos básicos do C ++, que devem ser aprendidos para fazer qualquer coisa que foi introduzida na última revisão e não existe em uma versão anterior do C ++.
Ramhound 16/08
11
Nunca confie em um livro de Herb Schildt. Realmente, enquanto a maioria dos livros em C ++ por aí são maus (e não estou me referindo a questões estilísticas aqui, mas erros factuais flagrantes e promovendo estilos de programação conhecidos por levar a códigos de bugs), os livros de Schildt têm sido extremamente ruins, seu nome se tornou um pouco de meme.
SBI
4
@ Ramhound: Eu discordo. Se isso fosse verdade, todos nós ainda aprenderíamos primeiro o gerenciamento manual de recursos e só então maneiras mais seguras de criar recursos dinâmicos. Felizmente, isso está (lentamente) mudando. Novas possibilidades, mesmo que sejam "apenas" na biblioteca, exigem novos idiomas. Se você começa com um idioma, por que aprender idiomas mais antigos primeiro, apenas para ter que desaprendê-los mais tarde?
SBI

Respostas:

16

Absolutamente. Hoje em dia, três coisas que geralmente estão na lição 2 devem mudar muito, muito mais tarde:

  • strings como matrizes de char *, os métodos strlen, strxxx e assim por diante
  • matrizes em geral e aritmética de ponteiro
  • exclua o que você novo, exclua [] o que você novo [] e até destruidores

Essas coisas que geralmente estão na lição 99 devem mudar muito, muito antes

  • modelos como itens a serem usados ​​(escrever, não muito)
  • std :: string
  • std :: shared_ptr <>
  • std :: vector <>, iteradores, outras coleções

Cada ponteiro bruto deve ser imediatamente entregue a um invólucro de ponteiro inteligente (eu começaria com compartilhado e consideraria único mais tarde, pois requer explicação de referências std :: move e rvalue). Fazer isso fará com que o aprendizado de C ++ seja muito parecido com o aprendizado de Java ou C #, onde você aprende a biblioteca ao mesmo tempo que a linguagem. Isso também retira muito do trabalho da memória e deixa as pessoas menos preocupadas com truques.

Eu também trabalharia lambdas na imagem na primeira vez que quisemos iterar através de uma coleção e fazer algo para cada elemento.

Isenção de responsabilidade: Estou escrevendo um curso de C ++ para o Pluralsight agora e usando essa abordagem. O último módulo é "entender o código de outras pessoas" e é aí que colocarei coisas confusas, como char * strings, gerenciamento manual de memória, aritmética de ponteiros e assim por diante.

Atualização: algumas pessoas perguntaram por que a existência do C ++ 0x inspira o ensino de coisas que poderiam ter sido ensinadas com o C ++ 03. Eu acho que é uma série de coisas:

  • ponteiros verdadeiramente inteligentes, que são amigáveis ​​à coleção, eliminam a necessidade de coisas como "uma série de ponteiros para funcionários" que estavam nos fazendo voltar sempre a usar novos / excluir, aritmética de ponteiros etc.
  • auto tira a dor das declarações do iterador
  • lambdas fazem prever algo que uma pessoa comum faria
  • até algo tão trivial quanto a análise >>elimina a pegadinha que estaria presente ao declarar alguns modelos de modelos
  • e assim por diante

Na minha opinião, há coisas que poderíamos ter mudado sobre o modo como ensinávamos C ++ há algum tempo, mas alguns de nós nos contivemos porque ainda precisávamos da maneira da velha escola para fazer um fallback ou porque ensiná-la envolvia muito de conhecimento arcano.

Kate Gregory
fonte
3
Por que você acha que o gerenciamento manual de memória deve ser ensinado mais tarde? Eu acho que é importante saber e isso dá mais valor ao aprender dicas inteligentes. Eu tive que aprender gerenciamento de memória (e matrizes de caracteres) em C e isso me fez apreciar RAII e std :: string muito mais do que eu pensaria se não tivesse que fazer isso.
Jetti
1
Seus exemplos se aplicam principalmente a C ++ 98 vs. C ++ pré-padrão, não a C ++ 03 vs. C ++ 11. Suponho que, dado o lambda, std::for_each()seja muito mais popular do que costumava ser, autoseja muito importante, e a nova sintaxe da declaração de função (em conjunto com decltype) seja usada bastante no código do modelo. Essas são coisas que nenhum livro atual de C ++ ensina. Mas sim, em geral eu concordo com você ( +1). Quando comecei a dar cursos de C ++, comecei com C ++ acelerado e, embora meu curso tenha se desviado cada vez mais dele, ele ainda se mantém fiel ao princípio subjacente.
SBI
3
@Jetti: Eu raramente faço gerenciamento manual de recursos e, se o faço, é para implementar classes RAII. No entanto, uso muitas dessas classes. De acordo com isso, o uso de material RAII parece mais importante do que lidar com recursos brutos e, portanto, deve ser ensinado mais cedo, com mais ênfase.
SBI
1
@sbi: Eu tenho que concordar com você, a maioria desses exemplos parece Modern C ++ 101 de 2006, não algo novo sobre C ++ 11.
DeadMG
2
@Jetti: O passo mais importante para dominar o C ++ é aprender todas as maneiras pelas quais você pode evitar o gerenciamento manual de memória. É absolutamente algo que deve ser ensinado "mais tarde", uma vez que você aprendeu até onde pode ir através do gerenciamento de memória "automático".
jalf
9

Praticamente sim. O fato simples é que, em C ++ 98 e 03, muitas boas práticas eram fundamentalmente inutilizáveis ​​devido à baixa qualidade do suporte de linguagem para, por exemplo, programação funcional. Agora que as lambdas existem e funcionam, as pessoas tendem a aceitar interfaces funcionais muito melhor do que costumavam, e a programação genérica é ainda mais forte do que antes.

Em 1998, as pessoas estavam apenas começando a descobrir como escrever código rápido, seguro e de alta qualidade usando C ++, e muito código era "C era Classes". No C ++ 11, são idiomas muito diferentes, como copiar e trocar, e a Regra dos Três (agora Cinco) é bem conhecida e definida, e muito mais tipos de gerenciamento de recursos se tornaram Padrão, como shared_ptre unique_ptronde os Padrões anteriores simplesmente os deixaram. como buracos abertos.

Você pode visualizar esta pergunta para obter uma excelente lista de material de referência em C ++.

DeadMG
fonte
1
Na verdade, eu colocaria o início do final de "C com aulas" alguns anos antes de 1998, mas, em geral, você está certo, e não iria pechinchar mais de meia década. +1de mim.
SBI
4

Não conheço o livro específico que você mencionou. Mas, em geral, você pode dizer que todos os conceitos básicos sobre sintaxe C ++, tipos de dados e OOP ainda são verdadeiros. O mesmo vale para as bibliotecas STL mencionadas na maioria dos livros para iniciantes.

Embora um livro tão antigo quanto 1998 possa ter perdido algumas atualizações e desenvolvimentos no estilo de programação C ++, que se acumularam na comunidade ao longo dos anos. Eu procuraria recursos um pouco mais atualizados. Existem mais do que suficientes tutoriais e documentos on-line gratuitos que devem fornecer um bom começo. Alguns deles podem até mencionar C ++ 0x.

O C ++ 0x certamente mudará muito sobre como os programadores veem e usam a linguagem no futuro. Mas isso influenciaria projetos mais complexos, onde os novos recursos começam a fazer sentido. Para um iniciante, isso não importa e você pode se concentrar em se familiarizar com os conceitos existentes, isso já é suficiente para aprender. Como muitos livros para iniciantes não se aprofundam nos modelos, por exemplo, os novos modelos variados não são o que você precisa saber agora.

Talvez dê uma olhada em uma lista de alterações . Pelo menos alguns conceitos como o intervalo baseado em loops provavelmente aparecerão em novos tutoriais, mesmo para iniciantes. Então vale a pena dar uma olhada.

thorsten müller
fonte
Obrigado! Você conhece algum recurso decente online ou livros?
Jetti
2
Não, o site cplusplus é frequentemente mencionado como um recurso que nunca, jamais deve ser referido a alguém que você deseja realmente escrever um bom código.
DeadMG
@DeadMG Você tem um site alternativo?
TheLQ
@ TheLQ: Você iria além com a referência do MSDN ou cprogramming.com.
DeadMG 16/08
@Jetti: Não conheço nenhum material para usar o C ++ 11 para ensinar C ++. Tudo o que vi ensina C ++ 11 sobre C ++ 03. Para aprender o último, consulte stackoverflow.com/questions/388242/… .
SBI
3

Obviamente, com relação a qualquer coisa relacionada à tecnologia, estar atualizado com o material mais recente é sempre uma jogada inteligente; no entanto, as alterações introduzidas no C ++ 11 foram projetadas para não abalar o barco. Se você é novo em C ++ (ou programação em geral), isso não é algo que me preocuparia.

Além disso, se você é um programador profissional, pode apostar que estará trabalhando no código de outra pessoa no futuro, portanto sempre haverá valor em entender como as coisas funcionam, mesmo que seja uma técnica depreciada na prática.

leo
fonte
Obrigado pela sua resposta, achei que pelo menos me ajudaria a analisar o código antigo ao usar um recurso antigo.
Jetti
Como a autoexecução das funções lambda, e assíncrona poderia fazer outra coisa senão "agitar o barco"?
SBI
1
Eu diria que há uma distinção entre a introdução de novas ferramentas e uma ampla mudança na filosofia de design (como estamos vendo com PHP, por exemplo)
leo
1
@leo: eu discordo. A introdução do STL, ponteiros inteligentes e recursos avançados de modelos mudou totalmente a filosofia de design convencional do C ++. Quase todas as bibliotecas de impulso são totalmente diferentes da sua biblioteca C ++ média dos anos 90.
SBI