Quão diferente é Objective-C de C ++? [fechadas]

171

Quais são as principais diferenças entre Objective-C e C ++ em termos de sintaxe, recursos, paradigmas, estruturas e bibliotecas?

* Importante: Meu objetivo não é iniciar uma guerra de desempenho entre os dois idiomas. Eu só quero fatos reais. De fato, minha pergunta não está relacionada ao desempenho! Forneça fontes para qualquer coisa que possa parecer subjetiva.

Alerty
fonte
2
Este guia fornece a melhor comparação que eu já vi.
LiraNuna
@Oskar Kjellin: As respostas do Mac e do LiraNuna são excelentes respostas. Não posso decidir objetivamente qual é o melhor, porque ambos complementam a resposta do outro.
Alerty
@ Alerty bem, eu sei (tropeçar nisso com bastante frequência). Talvez apenas marque a primeira como respondida, e é isso que eu faço quando não consigo decidir. Eu não gosto quando há perguntas que não estão marcadas como respondidas quando estão :(
Oskar Kjellin 06/04/10
1
Coloque um link para a segunda resposta na primeira e vice-versa
Lee Taylor

Respostas:

185

Pequena lista de algumas das principais diferenças:

  • C ++ permite herança múltipla, Objective-C não.
  • Diferentemente do C ++, o Objective-C permite que os parâmetros do método sejam nomeados e a assinatura do método inclui apenas os nomes e tipos dos parâmetros e do tipo de retorno (consulte os comentários de bbum e Chuck abaixo). Em comparação, uma assinatura da função de membro C ++ contém o nome da função e apenas os tipos dos parâmetros / return (sem seus nomes).
  • C ++ usa bool, truee false, Objective-C usa BOOL, YESe NO.
  • C ++ usa void*e nullptr, Objective-C prefere ide nil.
  • O Objective-C usa "seletores" (que possuem tipo SEL) como um equivalente aproximado aos ponteiros de função.
  • O Objective-C usa um paradigma de mensagens (à la Smalltalk) onde você pode enviar "mensagens" para objetos através de métodos / seletores.
  • O Objective-C alegremente permitirá que você envie uma mensagem para nil, ao contrário do C ++, que falhará se você tentar chamar uma função membro denullptr
  • O Objective-C permite o despacho dinâmico, permitindo que a classe que responde a uma mensagem seja determinada em tempo de execução, diferentemente do C ++ em que o objeto em que um método é chamado deve ser conhecido em tempo de compilação (consulte o comentário de wilhelmtell abaixo). Isso está relacionado ao ponto anterior.
  • O Objective-C permite a geração automática de acessadores para variáveis-membro usando "propriedades".
  • O Objective-C permite atribuir selfe permite que os inicializadores de classe (semelhantes aos construtores) retornem uma classe completamente diferente, se desejado. Ao contrário do C ++, onde se você criar uma nova instância de uma classe (implicitamente na pilha ou explicitamente new), é garantido que seja do tipo que você especificou originalmente.
  • Da mesma forma, no Objective-C, outras classes também podem alterar dinamicamente uma classe de destino no tempo de execução para interceptar chamadas de método.
  • O Objective-C não possui o recurso de namespace do C ++.
  • O Objective-C não possui um equivalente às referências C ++.
  • O Objective-C não possui modelos, preferindo (por exemplo) permitir digitação fraca em contêineres.
  • Objective-C não permite sobrecarga implícita de método, mas C ++. Ou seja, em C ++ int foo (void)e int foo (int)definir uma sobrecarga implícita do método foo, mas para obter o mesmo em Objective-C, são necessárias sobrecargas explícitas - (int) fooe - (int) foo:(int) intParam. Isso ocorre porque os parâmetros nomeados do Objective-C são funcionalmente equivalentes ao nome do C ++.
  • O Objective-C felizmente permitirá que um método e uma variável compartilhem o mesmo nome, diferente do C ++, que normalmente tem ajustes. Imagino que isso tenha algo a ver com o Objective-C usando seletores em vez de ponteiros de função e, portanto, nomes de métodos que na verdade não têm um "valor".
  • O Objective-C não permite que objetos sejam criados na pilha - todos os objetos devem ser alocados da pilha (explicitamente com uma allocmensagem ou implicitamente em um método de fábrica apropriado).
  • Como o C ++, o Objective-C possui estruturas e classes. No entanto, onde em C ++ eles são tratados quase exatamente da mesma forma, em Objective-C são tratados de maneira totalmente diferente - você pode criar estruturas na pilha, por exemplo.

Na minha opinião, provavelmente a maior diferença é a sintaxe. Você pode conseguir essencialmente as mesmas coisas em qualquer idioma, mas, na minha opinião, a sintaxe do C ++ é mais simples, enquanto alguns dos recursos do Objective-C facilitam certas tarefas (como o design da GUI) graças ao envio dinâmico.

Provavelmente muitas outras coisas que eu também perdi, vou atualizar com todas as outras coisas que eu pensar. Fora isso, recomendo o guia que o LiraNuna apontou. Aliás, outro site de interesse pode ser esse .

Devo salientar também que estou começando a aprender o Objective-C e, como tal, muitas das opções acima podem não estar corretas ou completas - peço desculpas se for esse o caso e recebo sugestões de melhorias.

EDIT: atualizado para abordar os pontos levantados nos comentários a seguir, adicionou mais alguns itens à lista.

Mac
fonte
8
Lista decente; uma correção. Eles não são "parâmetros nomeados", mas "parâmetros intercalados". Nomeados e "argumentos de palavras-chave" levam à confusão de pensar que algum subconjunto do nome do método pode ser omitido. Eu não posso.
bbum
7
Você esqueceu de registrar a diferença mais importante: o Object-C usa envio dinâmico, enquanto o C ++ usa envio estático. Em outras palavras, o código compilado por um compilador Objective-C terá a classe responsável por responder a uma mensagem determinada em tempo de execução; código compilado por um compilador C ++ tem essas informações calculadas e compiladas em tempo de compilação.
wilhelmtell
9
@ wilhelmtell: O compilador C ++ conhece apenas a superclasse no momento da compilação. Em tempo de execução, a classe real pode ser qualquer descendente. Essa também é uma forma de envio dinâmico, mas não a mesma usada no objetivo C. Apenas tome cuidado com esses termos técnicos!
Norman Ramsey
5
+1 boa lista. No entanto, o Objective-C também usa void*e NULL, apenas não para objetos. Você pode usar qualquer ponteiro de estilo C no Obj-C, e muitas chamadas de API realmente passam ou retornam valores por referência; nesse caso, NULLé freqüentemente usado.
Quinn Taylor
3
@wilhelmtell - Não sei nada sobre o objetivo-C, mas em C ++ você PODE dinamicamente ter uma classe diferente responder a uma chamada de função, mas você precisa ter algo como uma matriz de ponteiros para uma classe base e, em seguida, as classes ACTUAL que estão "pendurados" nele. Enquanto todas as classes precisam ter subclasses, uma chamada de método chamará métodos diferentes, dependendo da classe, em tempo de execução.
Kevin Anderson
33

Enquanto ambos estão enraizados em C, eles são dois idiomas completamente diferentes.

Uma grande diferença é que o Objective-C se concentra nas decisões de tempo de execução para despacho e depende muito de sua biblioteca de tempo de execução para lidar com herança e polimorfismo, enquanto no C ++ o foco geralmente se baseia em decisões estáticas e em tempo de compilação.

Em relação às bibliotecas, você pode usar bibliotecas C simples em ambos os idiomas - mas suas bibliotecas nativas são completamente diferentes.

O interessante é que você pode misturar os dois idiomas (com algumas limitações). O resultado é chamado de Objective-C ++ .

Georg Fritzsche
fonte
link atualizado: Objective-C ++
IcyIcicle
6

Eles são completamente diferentes. O objetivo C tem mais em comum com o Smalltalk do que com o C ++ (bem, exceto pela sintaxe, na verdade).

Dean Harding
fonte
6

Em cima da minha cabeça:

  1. Estilos - Obj-C é dinâmico, C ++ é tipicamente estático
  2. Embora ambos sejam POO, tenho certeza de que as soluções seriam diferentes.
  3. Modelo de objeto diferente (C ++ é restrito por seu sistema de tipo em tempo de compilação).

Para mim, a maior diferença é o sistema de modelos. O Obj-C permite fazer mensagens e introspecção, mas o C ++ possui os modelos cada vez mais poderosos.

Cada um tem seus pontos fortes.

Rev316
fonte
5

Como outros já disseram, o Objective-C é muito mais dinâmico em termos de como pensa em objetos versus o domínio estático do C ++.

O Objective-C, pertencendo à linhagem Smalltalk de linguagens orientadas a objetos, possui um conceito de objetos muito semelhante ao de Java, Python e outras linguagens orientadas a objetos não-C ++ "padrão". Muita expedição dinâmica, sem sobrecarga do operador, envia mensagens.

C ++ é seu próprio animal estranho; pulou principalmente a parte Smalltalk da árvore genealógica. De certa forma, ele possui um bom sistema de módulos com suporte à herança que pode ser usado para programação orientada a objetos. As coisas são muito mais estáticas (métodos substituíveis não são o padrão, por exemplo).

Michael Ekstrand
fonte
4

Objective-C é um superconjunto mais perfeito de C. Em C e Objective-C, a conversão implícita de void*para um ponteiro struct é permitida.

Foo* bar = malloc(sizeof(Foo));

O C ++ não será compilado, a menos que o voidponteiro seja explicitamente convertido:

Foo* bar = (Foo*)malloc(sizeof(Foo));

A relevância disso para a programação diária é zero, apenas um fato curioso.

Igor Zevaka
fonte
O segundo exemplo não é código C ++. É o código C que deu um erro ao tentar compilá-lo com o compilador C ++. Se você quiser old C ++ como perto de original, você escreveria Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));então talvez usar construtor inplace .. Mas a partir de hoje o seu Modern C ++ é mais como auto bar = new Foo(constructorArg);na verdade você não precisa malloc, e quer callic, você pode usar std::vector::reserve, estd::vector::emplace_mack
xakepp35
3

O Obj-C possui recursos muito mais dinâmicos na própria linguagem, enquanto o C ++ é mais focado em recursos de tempo de compilação com alguns recursos dinâmicos.

Em, o polimorfismo paramétrico do C ++ é verificado no tempo de compilação, enquanto no Obj-C, o polimorfismo paramétrico é alcançado através do envio dinâmico e não é verificado no tempo de compilação.

Obj-C é de natureza muito dinâmica. Você pode adicionar métodos a uma classe durante o tempo de execução. Além disso, possui introspecção em tempo de execução para examinar as classes. No C ++, a definição de classe não pode ser alterada e toda a introspecção deve ser feita em tempo de compilação. Embora a natureza dinâmica do Obj-C possa ser alcançada no C ++ usando um mapa de funções (ou algo assim), ainda é mais detalhada do que no Obj-C.

No C ++, há muito mais verificações que podem ser feitas em tempo de compilação. Por exemplo, usando um tipo de variante (como uma união), o compilador pode impor que todos os casos sejam gravados ou manipulados. Portanto, não se esqueça de lidar com os casos extremos de um problema. No entanto, todas essas verificações têm um preço ao compilar. O Obj-C é muito mais rápido na compilação que o C ++.

Paul Fultz II
fonte
3
Se você vai falar sobre preços, seja justo! Por outro lado, o Obj-C é muito mais lento na resolução de chamadas de método dinâmico em tempo de execução que o C ++. E eu argumentaria que a velocidade de compilação é uma trivialidade relativa em comparação à velocidade de tempo de execução. Tenho certeza de que o Obj-C oferece muitos benefícios devido ao seu envio mais dinâmico, mas há uma troca por lá.
underscore_d
1
É verdade que existe uma troca entre tempo de execução e custo de tempo de compilação. No entanto, o tempo de compilação nem sempre é trivial. O uso de metaprogramação pesada e bibliotecas EDSLs em C ++ (como Boost.Spirit) pode ter um efeito drástico no tempo de compilação, ao mesmo tempo em que produz código muito rápido no tempo de execução.
Paul Fultz II
1
Claro, eu estava simplificando demais em relação ao POV de bases de código mais simples ... Com bases de código muito complexas, recompilar para testar pequenas alterações pode tornar o desenvolvimento muito tedioso, o que não é uma trivialidade. Mas isso é algo que realmente podemos comparar entre os dois? Essas bibliotecas, tão dependentes dos recursos de tempo de compilação do C ++, podem ser reimaginadas no Objective-C e mostradas para compilar mais rapidamente? ie A declaração "Obj-C é muito mais rápido na compilação que C ++" refere-se a bases de código equivalentes para as quais uma aceleração replicável pode ser medida? Caso contrário, estamos comparando o tempo necessário para cultivar maçãs x laranjas.
Underscore_d