Quais são as diferenças fundamentais entre C e C ++? [fechadas]

41

Muitos tendem a escrever "C / C ++", como se fossem a mesma coisa. Embora compartilhem muitas semelhanças, elas claramente não são as mesmas.

Mas quais são realmente as diferenças fundamentais entre C e C ++? O C ++ é uma versão aprimorada do C ou há recursos no C que não existem no C ++?

gablin
fonte
2
Eu pensei que C ++ é super conjunto de C
usuário
1
C ++ não é reforçada ... é um super conjunto de C ..
Joe DF
2
@JoeDF Foi no começo, mas agora é "compatível com C", o que não significa a mesma coisa. Você não codifica em C em C ++ e nem todo C padrão é compatível com C ++ padrão.
Klaim
+1 Você está certo, agora existem como irmãos ou primos. Se você souber o que quero dizer.
21414 Joe Joe DF

Respostas:

43

Os seguintes pontos estão relacionados ao C ++:

  1. sistema de tipo estático (definido pelo usuário): permite verificações estáticas sobre seus dados e seu uso - aponta muitos erros facilmente executados em C.
  2. multi- "paradigma": permite trabalhar como em C, com paradigmas orientados a objetos, com paradigmas genéricos etc.
  3. Construtor / Destrutor: a única maneira de dizer uma vez o que fazer ao criar ou destruir algo e garantir que o usuário não precise encontrar a função correta e usá-la como em C.
  4. RAII (nome incorreto): você não precisa sempre gerenciar a memória. Apenas mantenha as coisas no escopo e use indicadores inteligentes que descrevam a vida útil dos seus objetos. Ainda pode usar ponteiros brutos.
  5. Modelos: melhor que a macro, uma linguagem real para manipular e gerar tipos antes da compilação final. Falta apenas um sistema de tipos (consulte Conceitos em futuros padrões C ++).
  6. Sobrecargas de operador: permite descrever operações de uma maneira sintática simples e até definir linguagens específicas de domínio incorporadas dentro do seu código C ++.
  7. Nomes com escopo: namespaces, classes / struct, funções, etc. têm regras simples para garantir que os nomes não entrem em conflito.
  8. Sistema de exceção: uma maneira de propagar erros que geralmente são melhores que o código de retorno. De fato, o código de retorno é bom para erros lógicos específicos do domínio, porque o aplicativo precisa gerenciá-lo. Exceções são usadas para erros "difíceis", coisas que tornam o código a seguir incorreto. Permite capturar erros mais altos na pilha de chamadas, se possível, reagir a essa exceção (registrando ou corrigindo o estado) e com o RAII, se bem utilizado, não faz com que todo o programa esteja errado - se bem, novamente.
  9. A Biblioteca Padrão: C possui uma biblioteca própria, mas é tudo "dinâmico". A biblioteca padrão C ++ é quase (não fluxos de E / S) feita de modelos (contêineres e algoritmos) que permite gerar código apenas para o que você usa. Melhor: como o compilador precisa gerar código, ele saberá muito sobre o contexto e aplicará muitas otimizações, sem precisar exigir que o codificador ofusque seu código - graças a modelos e outras coisas.
  10. const-correctness: a melhor maneira de garantir que você não altere variáveis ​​que não deveria. Permite especificar o acesso somente leitura aos varaibles. E é verificado apenas no momento da compilação, para que não haja custo de tempo de execução.
Klaim
fonte
31

O C ++ foi inventado para gerenciar a complexidade com a qual o C não podia lidar. Por exemplo, um problema comum com C era que você podia "ficar sem nomes para variáveis" (não deve ser tomado literalmente, é claro) porque não havia encapsulamento, espaços para nome etc.

Além disso, C não possui exceções, portanto, o tratamento de erros é muito suscetível a erros, pois depende do usuário da biblioteca sempre verificar os valores de retorno de funcs, enquanto que com exceções, o desenvolvedor da biblioteca simplesmente lança uma exceção que garante que o fluxo do programa seja interrompido.

O C ++ ajuda ao ter objetos construtores init que são chamados automaticamente pelo compilador. Ao contrário de estruturas C, que precisam ser inicializadas pelo programador (daí outra área propensa a erros).

Por fim, existem muitas outras vantagens apresentadas pelo OOP, como a reutilização de objetos, bem como os conceitos genéricos baseados em programação, como modelos e genéricos que permitem reutilizar o código fonte, etc.

E muitas outras coisas que levariam muito do meu tempo para listar aqui.

Jas
fonte
Eu gosto que você escreva sobre o construtor C ++ vs estruturas C e que é propenso a erros. Eu concordo com isso. Mas não gosto da maneira Java de usar isso no JavaBeans, que sempre usa um construtor vazio e depois define os campos dos membros com setters. No meu ponto de vista, isso é tão suscetível a erros quanto as estruturas C. Eu preferiria definir meus objetos Java apenas com o construtor. Veja minha pergunta no StackOverflow sobre isso.
Jonas
Você tem razão, mas o foco da minha resposta aqui foi C vs. C ++.
Jas
1
Ah, vamos lá, quem impede você de usar OOP com C? Você pode reutilizar objetos e fazer qualquer coisa, mesmo exceções. Existe até um livro sobre isso, chamado de programação OOP em C.
2
@ Vlad, nada do que você está falando era uma opção há 25 anos.
Jas
4
É possível fazer POO em quase todas as linguagens de programação ainda em uso, mas isso não significa que a linguagem foi projetada para isso. Tome Lua, por exemplo. Embora tecnicamente permita OOP, parece que existem cerca de cinquenta maneiras diferentes de fazer isso, uma causa de muita dor de cabeça.
tyjkenn
15

Em geral, tudo o que existe em C é suportado em C ++. Obviamente, o oposto é absolutamente falso.

Simplesmente falando, C ++ é orientado a objetos (por exemplo, você tem classes), C não.

C ++ tem um tipo booleano C89 não.

Eles são idiomas diferentes. Eles apenas compartilham a maior parte da sintaxe.

Federico klez Culloca
fonte
4
C99 tem um tipo booleano (nomeado _Bool, com boolum alias).
Jerry Coffin
1
Isto não é estritamente verdade. Por exemplo, C99 possui o long longtipo de dados que ainda não faz parte do ISO C ++.
Chinmay Kanchi
11
Err ... C ++ não é apenas orientado a objetos: você pode usar paradigmas orientados a objetos com C ++ porque a linguagem fornece recursos para isso, mas fornece recursos para outros paradigmas também. Você deve mencionar que, é realmente importante, muda tudo. Se isso não aconteceu, todos nós teríamos interruptor para java ...
Klaim
4
Existem muitas construções em C que não funcionam em C ++.
1
@klez: sim - mas ainda está errado. Embora a ANSI tenha desenvolvido originalmente o C89 (que não tinha um tipo booleano), agora o novo desenvolvimento é feito pela ISO, e a ANSI aceita o padrão ISO; portanto, o padrão ANSI C atual é idêntico ao padrão ISO C atual (que possui um tipo booleano).
Jerry Coffin
8

O C99 possui alguns recursos que não existem (pelo menos exatamente da mesma forma) em C ++ (por exemplo, membros de matriz flexíveis, matrizes de comprimento variável, etc.)

O C99 também adicionou muito à biblioteca que não está presente no padrão C ++ 98/03; a maior parte disso foi adicionada ao C ++ 11.

Em termos de orientação básica, C suporta basicamente programação processual estruturada. O C ++ suporta isso, além de programação orientada a objetos, programação genérica e metaprogramação (executando computação arbitrária em tempo de compilação). Com o C ++ 11, ele adiciona alguns bits e partes que também podem ser confundidos com suporte à programação funcional (por exemplo, expressões lambda). O C ++ 14 adicionou mais alguns, mas a maioria deles é realmente mais conveniente do que qualquer tipo de mudança importante na orientação.

Jerry Coffin
fonte
1

Pessoalmente, acho que os modelos são o recurso mais significativo que o C ++ adiciona ao C.

zvrba
fonte
1
E quanto às classes com herança? Isso é realmente um trabalho árduo em C, enquanto muitos modelos podem ser feitos com macros de pré-processador.
precisa saber é o seguinte
4
As macros do pré-processador não são seguras para o tipo; é pura substituição de texto, o que também torna a depuração mais difícil. Obter classes básicas e herança para o trabalho não é muito trabalhoso em C. + você cria seu próprio modelo de metaobjeto em vez de ficar preso ao que o designer de linguagem escolheu para você. Veja, por exemplo, este artigo: arxiv.org/abs/1003.2547
zvrba
2
Meu voto seria destruidor do recurso mais significativo que o C ++ possui sobre o C (mesmo sobre construtores devido às suas incríveis capacidades de limpeza).
21814 Thomas Eding
@zvrba #define GENERATE_INTERFACE(T) T T##_func(T x);; (tipo) sobrecarga / modelos seguros em C. Concordo com Thomas que os destruidores são um recurso muito mais importante que C está ausente. Mas os destruidores costumam ocultar códigos importantes. Namespaces (escopo) são, na minha opinião, os mais importantes.
YoYoYonnY