O que devo saber sobre C ++? [fechadas]

8

Recentemente, comecei a aprender C ++ e gosto muito disso.

Eu sempre li que é mais fácil escrever código ruim em C ++ do que na maioria dos idiomas, e que é muito mais profundo do que parece.

Como eu gostaria de evitar escrever código incorreto, fiquei pensando o que exatamente não deveria fazer e o que devo fazer para escrever um código bom em C ++.

DistantEcho
fonte
1
Quais livros em C ++ você leu ou está lendo?
Fred Nurk
Nenhum ainda. Eu estava procurando por bons livros também, mas eu encontrei muitos deles e agora eu não sei por onde começar ( stackoverflow.com/questions/388242/... )
DistantEcho
Não se confunda com livros, vou recomendar Robert Lafore ( amazon.com/Object-Oriented-Programming-4th-Robert-Lafore/dp/… ) ou C ++ Premier ( amazon.com/dp/0201721481/?tag= stackoverfl08-20 ) à medida que você progride escrevendo mais código, você mesmo saberá o que deve evitar. Como você não sabe muito sobre C ++, acho que não será capaz de entender (praticamente) o que está sendo aconselhado a evitar nas respostas aqui.
Ranger
3
Quando a única ferramenta em sua caixa de ferramentas é C ++, tudo parece um polegar ....
CurtisHx

Respostas:

21

As armadilhas

Existem tantas armadilhas no C ++ que, se você não as conhecer, criará um código muito instável, com toneladas de vazamentos de memória e saturação de buffer. Comparado a idiomas mais modernos com coleta de lixo, você deve liberar toda a memória. Além disso, o código é de nível muito baixo. Não há nada que o impeça de sobrescrever seu próprio código de programa (que foi explorado por muitos hacks do IE).

Portanto, o próximo passo a ser aprendido são as práticas de programação que atenuam esses riscos, por exemplo, usando ponteiros inteligentes para lidar com a liberação de objetos, agrupando matrizes de bytes em classes que lidam com os dados, etc.

Posso recomendar os livros de Scott Meyers "Effective C ++" e "More Effective C ++".

Esses livros me ensinaram essencialmente a beleza do C ++. Observe que estes não são livros para iniciantes. Eles assumem que você já está familiarizado com o idioma.

Pete
fonte
4
"Accelerated C ++", de Koenig e Moo, é um bom livro para novos programadores de C ++, pois introduziu modelos e classes mostrando exemplos de uso primeiro, depois design e criação. Achei mais fácil entender por que usá-los com essa abordagem.
Larry Coleman
Comecei a ler o C ++ eficaz, e isso realmente ajuda muito. Obrigado !
DistantEcho
2
" Não há nada impedindo que você substitua seu próprio código de programa " Hein? O que? Isso não é culpa do idioma - na verdade, na maioria dos sistemas operacionais, isso não é possível, a menos que você tome medidas ativas para torná-lo possível. E programas mal escritos são potencialmente exploráveis, independentemente do idioma em que estão escritos. Sim, o C ++ é de baixo nível e, sim, possui suas falhas, mas não vamos exagerar com esse absurdo.
Nik Bougalis
@NikBougalis O sistema operacional evita isso - nos casos em que o sistema operacional evita - mas o C / C ++, por padrão, fornece um método para fazê-lo, nos casos em que o sistema operacional não o impede; enquanto muitos outros idiomas não. Portanto, não é realmente absurdo caracterizar isso como um problema de linguagem - mas eu concordo que o ponto original é exagerado.
greggo 5/09/14
5
@greggo é um absurdo - pode-se também reclamar que uma caneca de café não o protege de derramar sal acidentalmente em seu café. O fato é o seguinte: C e C ++ não sabem nada sobre o seu programa ou o sistema em que está sendo executado. O idioma não poderia tratar da preocupação "zomg! Meu programa foi substituído" sem primeiro alterar fundamentalmente as suposições subjacentes nas quais o idioma é construído.
Nik Bougalis
20

Expressões idiomáticas

O C ++ suporta uma grande variedade de recursos. Da mesma forma, pode-se facilmente tentar usá-lo de muitas maneiras ou estilos diferentes. Infelizmente, isso não se adequa a muitos deles - e, portanto, torna-se tedioso, propenso a erros ou lento.

Ou formulado de maneira diferente, sem realmente saber o que você faz, é incrivelmente fácil usar o C ++ de maneira errada (o que seria muito melhor suportado em outros idiomas). Portanto, aprender com simplicidade pode levar a uma direção errada - portanto, a leitura de bons livros é provavelmente mais importante do que em outros idiomas (consulte esta postagem sobre o mesmo tópico).

Java, por exemplo, é uma linguagem inerentemente orientada a objetos. Você não pode programar isso muito diferente disso. Em C ++, no entanto, você pode . Você pode usá-lo como faria em C ou Java - e de nenhuma maneira é o que o C ++ se destaca, portanto é melhor ficar com C ou Java nesses casos.

Portanto, você realmente precisa conhecer o estilo e os idiomas adequados para obter o C ++ correto, desde o início. Infelizmente, eles podem ser bastante complexos no começo, mas aqui estão alguns - do simples ao avançado.

  • Usar const
  • Não se preocupe com micro-otimizações (devo inlineuma função << ou *etc.?)
  • Evite usar ponteiro bruto ou matrizes sempre que possível (especialmente void*). Use referências ou ponteiros inteligentes
  • Escreva código genérico = Compreenda modelos
  • Entenda os cabeçalhos / arquivos de código / pré-processador (mas evite macros)
  • Use o STL (e entenda os conceitos subjacentes)!
  • Usar impulso
  • Pense na vida útil e no escopo do objeto - Gerencie RAII
  • Não escreva código orientado a objetos (isto é, muito polimorfismo de tempo de execução, herança) em primeiro lugar - existem linguagens OO muito melhores por aí
  • Use objetos em vez disso
  • Prefira polimorfismo estático
  • Use as funções de tempo de compilação
Dario
fonte
Obrigado pelos conselhos. Eu realmente não entendo por que devo evitar escrever código orientado a objetos; ou você quis dizer algumas partes do OOP especificamente?
DistantEcho
1
OOP não significa apenas programação com objetos, implica certos padrões de design, polimorfismo de tempo de execução por herança, hierarquias de classes ... O C ++ não é realmente bom para expressar isso - você precisa de ponteiros (inteligentes) e gerenciamento de memória explícito para o polimorfismo de tempo de execução, é relativamente lento e cheio de armadilhas (já se esqueceu de um destruidor virtual?). Você geralmente tem maneiras mais limpas de expressar o mesmo com objetos puros e, por exemplo, programação genérica / polimorfismo estático.
Dario
2
@ Niphra: não se trata de não usar OOP, é não se restringir a OOP. O C ++ oferece vários paradigmas, e bons programas em C ++ usam a maioria, se não todos, deles.
Matthieu M.
3
Nenhum desses são expressões idiomáticas. O conselho da OOP é questionável na melhor das hipóteses e parece confiar mais no medo do que em qualquer motivo técnico.
Edward Strange
"já esqueceu um destruidor virtual". Sim - importante ativar os avisos do compilador. Outra: 'a função que retorna um valor pode realmente não retornar um valor' - em um caso em que o valor retornado requer um construtor. kaboom. IMHO que o aviso deve estar ativado por padrão.
greggo 5/09/14
13

O poder do C ++ é que é uma linguagem incrível. A desvantagem do C ++ é que é uma linguagem incrível. Pode ser ao mesmo tempo imponente e terrível.

Se você quer aprender - e não há razão para não aprender - precisará aprender bem. Você precisará ler muito . Existem alguns livros que ajudarão você no seu caminho: C ++ acelerado o ajudará a começar, especialmente se você fizer os exercícios. C ++ efetivo, STL efetivo, C ++ excepcional e suas séries contínuas estão entre os melhores do jogo para obter dicas de como melhorar suas maneiras de trabalhar.

Kaz Dragon
fonte
4

Eu acho que uma coisa que ajudará no seu caminho de bom código é a experiência . Por enquanto, fique preso no idioma e não se preocupe muito com as "melhores práticas de codificação" até que você esteja confortável o suficiente para começar a procurar maneiras de melhorar seu uso. Você aprenderá a reconhecer o que é bom e o que é ruim. Depois de baixar o idioma, você pode olhar para trás e pensar "ok, eu deveria ter implementado isso de forma diferente" ou "isso parece confuso, como posso melhorar isso?"

Penso assim : se você aprende um novo idioma falado, não se aprofunda e aprende todas as regras gramaticais antes de começar a aprender palavras simples ou como dizer "onde fica o ponto de ônibus?". A programação (IMO) é como um segundo idioma (ou terceiro, quarto, etc). Trate-o como faria em qualquer outro idioma e aprenda fazendo. O resto virá com o tempo.

badgerr
fonte
1

Eu sempre li que é mais fácil escrever código ruim em C ++ do que na maioria dos idiomas, e que é muito mais profundo do que parece

esclarecimento: em C ++ é mais fácil escrever código incorreto sem querer do que em outras línguas. Você pode escrever código incorreto em qualquer idioma, mas em C ++ você define com as melhores intenções, mas geralmente acaba em algum lugar inesperado porque C ++ - depois de passar de "iniciante" para dizer "iniciante avançado", você tem a falsa impressão de que C ++ é mais fácil do que realmente é. Mas o C ++ está evoluindo e todas as novas bibliotecas de modelos tornam sua vida mais fácil (e segura).

AndersK
fonte
2
Isso também depende de como você aprende C ++. Se você começar a aprendê-lo como um C aprimorado, é mais provável que tenha problemas nesse estágio do que se apenas aprendê-lo como C ++.
David Thornley
É hora da citação obrigatória do Stroustrup: "C facilita o tiro no pé; o C ++ torna mais difícil, mas quando você faz uma coisa toda"
Mawg diz que restabelece Monica no dia
-1

Duas coisas:

  1. Como o Gerenciamento de memória funciona usando C ++?
  2. Como os ponteiros afetam o gerenciamento de memória em C ++?
Rachel
fonte
1
sua muito mais para c ++ do que a memória só ...
Nazgob