Quanta diferença existe entre aprender c ++ em comparação ao uso da linguagem c original?

Antes de tudo, C é um subconjunto de C ++. Para aprender C ++, você precisa conhecer a linguagem C primeiro.

O C ++ apresenta os conceitos de OOPs que tornam seu programa mais gerenciável e legível. Você pode otimizar seus programas usando diferentes padrões de design, conforme sua necessidade. Com o uso do STL, você pode fornecer volumes para seus programas e os algoritmos que fazem parte do STL são mais otimizados do que qualquer loop manuscrito.

Com o Modern C ++, você pode escrever código muito melhor e otimizado também.

Complexidade da linguagem. C ++ é ordens de mangnitude mais complexas que C. Essa complexidade tem problemas em 1) desempenho, 2) correção e 3) depuração. Há muito mais coisas que você pode errar no C ++ que simplesmente não existe no C. Mais do que o C, o idioma C ++ continua a evoluir. Então esse código que você escreveu há 5 anos. Não é mais compilado.

Para uma compreensão de quanto pode dar errado no C ++, leia os livros de Scott Myers sobre C ++. Ele diz que você deseja evitar C ++ e por que é uma má ideia.

C ++ 17 e C18 são linguagens totalmente diferentes, apesar de alguns antecedentes comuns e algumas semelhanças superficiais. Uma pessoa que conhece C18 pode ter mais dificuldade em aprender C ++ 17 em comparação com alguém que aprendeu C ++ 17 vindo de Python, exatamente porque as semelhanças podem ocultar as diferenças entre as pessoas que vêm de C18. Obviamente, embora a diferença pessoal quase certamente domine as generalidades.

Claro, você deve ler as outras respostas. No entanto, eu diria que a diferença é enorme. C ++ é muito diferente de C. Eu tenho usado ambos extensivamente. Eles são bem diferentes. A lista a seguir é um subconjunto das diferenças entre C ++ e C.

  • O C ++ possui classes e é uma linguagem de programação orientada a objetos. Esta é uma grande diferença por si só. No C ++, você pode definir classes e instanciar objetos de suas classes ou de qualquer outra classe. Fundamentalmente, você pode definir e implementar construtores e destruidores para cada uma de suas classes. Os construtores são importantes por razões óbvias. Os destruidores permitem a limpeza de recursos.
  • O C ++ possui o STL (Standard Template Library). O STL é enorme. Essencialmente, todos os programas C ++ (atualmente) usam o STL. O STL torna a programação muito (muito) mais fácil. Um livro típico da STL ("A biblioteca de modelos padrão do C ++") tem apenas 512 páginas.
  • C ++ tem o conceito de programação de modelos e metaprogramação de modelos em C ++. O mecanismo de programação de modelos é uma grande melhoria em relação ao pré-processador C. Eu usei apenas um pouquinho do mecanismo de programação de modelos C ++. É profundo e muito poderoso.
  • C ++ tem referências. As referências eliminam a necessidade de usar ponteiros para passar por referência (e não por valor). Também é possível retornar referências de funções e métodos de classe. Isso pode ser perigoso, mas também muito poderoso (e muito rápido).
  • C ++ tem exceções. Seria difícil exagerar o valor das exceções na criação de código em grande escala. O mecanismo de exceção permite um tratamento de erro muito controlado.
  • C ++ possui RAII. O acrônimo é terrível (Aquisição de recursos é inicialização). No entanto, o conceito não é. Basicamente, o RAII fornece uma maneira (ou tipo) de coleta automática de lixo. RAII (se implementado pelo programador) elimina vazamentos de memória (e outros recursos). Essa é uma melhoria muito grande em relação a C, onde vazamentos de recursos são comuns.
  • C ++ tem melhores (muito) bibliotecas que C. É claro que esse é um ponto subjetivo. No entanto, o mecanismo de classe C ++ torna possível bibliotecas muito mais sofisticadas do que C (ou pelo menos eu acho). Digite 'principais bibliotecas C ++' para obter uma lista de links muito úteis. Gostaria dos principais motores de jogo para esta lista. Os mecanismos de jogos em C ++ são incríveis (se você está tentando criar um jogo).
  • O C ++ possui fluxos versus os arquivos do C. Esse não é realmente um problema tão importante. Na minha opinião, os fluxos C ++ não foram um grande sucesso. Sim, eles são melhores que os arquivos C, mas não muito melhores.

Obviamente, existem muito mais diferenças entre C ++ e C. Algumas outras adicionais incluem bools, sobrecarga de funções, valores padrão, melhores enumerações, um modelo de memória com vários núcleos, // comentários, funções em linha, variáveis ​​locais para loops , namespaces, lambdas, baseados em intervalo para loops, funções virtuais / de amigos, etc. Observe que esta não é uma lista abrangente.

No geral, o C ++ está muito à frente do C. Atualmente, há poucas razões para usar o C. Alguns sistemas incorporados suportam apenas o C. No entanto, essas são as exceções.

Praticamente não há semelhanças.

O C ++ possui vários recursos de linguagem de alto nível, por exemplo, suporte a OOP, tipos de contêineres padrão como vetores e tuplas e outras coisas, tipos estáticos fortes, suporte a programação funcional (lambdas e closures e similares), modelos para programação / metaprogramação genérica, gerenciamento automático de memória ( indicadores inteligentes, contagem de referência, RAII e similares).

C tem ... minimalismo, eu acho: D É uma linguagem atraente, mas não é tão útil fora de alguns nichos específicos (por exemplo, programação incorporada, com pequenos microcontroladores e programação de SO, por exemplo, o kernel do Linux).

Curiosidade: muitas universidades que dizem que ensinam C ++ realmente ensinam C, a única coisa que C ++ em seus cursos é o compilador (os compiladores C ++ podem compilar o tipo de código C, por motivos de compatibilidade). Se não houver menção de modelos e RAII e similares, provavelmente você está lidando com um deles.

Deve-se pensar no C ++ como um pequeno acréscimo ao C, para que seja mais fácil criar programas maiores.

Os alunos precisam aprender termos como encapsulamento, polimorfismo, abstração, herança etc. etc., mas os programadores realmente nunca pensam ou usam esses termos. Em vez disso, deve-se pensar no que torna a programação mais fácil e segura.

A principal mudança que C fez em relação ao Fortran foi permitir estruturas em vez de apenas matrizes, para que você pudesse agrupar dados relacionados de diferentes tipos. Isso encerrou o problema no Fortran de que todas as variáveis ​​precisavam ser globais e criativas sobre nomes para evitar conflitos, mas ainda assim possibilitar lembrar o que eram. A estrutura deu aos programadores o uso de um esquema de nomenclatura opcional em 2 partes. Então, qual é a diferença entre a estrutura C e a classe C ++? É que a classe é apenas uma versão do struct que também permite agrupar funções relacionadas, além de dados. Em C, todas as funções são globais, assim como as variáveis ​​no Fortran. No C ++, você pode ter funções globais, mas também pode aninhá-las no esquema de nomeação de duas partes de uma estrutura, chamada de classe.

A segunda alteração de C ++ para C ++ é resolver o problema que C tem quando você precisa executar o mesmo tipo de ação em longas listas de itens, mas com um código ligeiramente diferente. Isso aparece constantemente quando você tem uma lista de exibição com elementos gráficos como linha, círculo, retângulo, etc. Em C, você precisa colocar uma tag no início das muitas estruturas diferentes que define, diferenciando exatamente o tipo de estrutura. Então você precisa de uma declaração enorme de switch nesse valor de tag, para chamar a função exata que você precisa, como DrawLine (), DrawCircle (), DrawRect (), etc. No C ++, você permite que o compilador ou o SO encontre a função exata. Você cria uma classe base para todos os elementos gráficos, como GraphicElement, contendo um método virtual chamado Draw (). Então, ao derivar todas as suas subclasses dessa classe pai, todas elas garantem ter uma função Draw (), que você utiliza em operações diferentes, mas ainda com o mesmo nome. Então, quando você percorre a lista de exibição e chega ao próximo elemento, basta chamar sua função Draw (). Você não precisa se importar com o tipo real e não precisa de uma declaração de chave.

E, embora exista muito mais em C ++, a maioria das outras coisas não deve ser usada pelos programadores e foi projetada realmente para aqueles que escrevem compiladores, bibliotecas compartilhadas etc. Por exemplo, nunca sobrecarregue os operadores, pois isso nunca é intuitivo e um nome de função mais longo é sempre Melhor. Se funções ou variáveis ​​de classe são privadas, é totalmente inútil dentro do seu próprio código que ninguém mais vai usar. Se você não vê uma vantagem óbvia e um motivo para usar qualquer coisa, não use. Mantenha seu código o mais simples e óbvio possível, sempre. Então seu código não será descartado se você for atropelado por um ônibus um dia. Meu código de 50 anos atrás ainda está sendo usado hoje.