Quão diferente é o Objective-C do C++?



(5)

Quais são as principais diferenças entre Objective-C e C ++ em termos de sintaxe, características, paradigmas, frameworks e bibliotecas?

* Importante: Meu objetivo não é iniciar uma guerra de desempenho entre os dois idiomas. Eu só quero fatos duros reais. Na verdade, minha pergunta não está relacionada ao desempenho! Por favor, dê fontes para qualquer coisa que possa parecer subjetiva.

https://src-bin.com


Answer #1

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

Objective-C, estando na linhagem Smalltalk de linguagens orientadas a objetos, tem um conceito de objetos que é muito semelhante ao de Java, Python e outras linguagens orientadas a objeto não-C ++ "padrão". Muita despacho dinâmico, sem sobrecarga de operador, envia mensagens por aí.

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


Answer #2

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


Answer #3

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

A principal diferença é que o Objective-C é focado em decisões de tempo de execução para despacho e depende muito de sua biblioteca de tempo de execução para manipular herança e polimorfismo, enquanto em C ++ o foco geralmente está nas decisões estáticas, de 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.

De interesse, porém, é que você pode misturar ambas as linguagens (com algumas limitações). O resultado é chamado Objective-C++ .


Answer #4

O Obj-C tem muito mais capacidades dinâmicas na linguagem em si, enquanto o C ++ está mais focado nos recursos de tempo de compilação com alguns recursos dinâmicos.

Em, o polimorfismo paramétrico de C ++ é verificado em tempo de compilação, enquanto que em Obj-C, o polimorfismo paramétrico é obtido através de despacho dinâmico e não é verificado em tempo de compilação.

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

Em 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. Então você não se esquece de lidar com os casos extremos de um problema. No entanto, todas essas verificações têm um preço ao serem compiladas. O Obj-C é muito mais rápido na compilação do que o C ++.


Answer #5

Pequena lista de algumas das principais diferenças:

  • C ++ permite herança múltipla, Objective-C não.
  • Ao contrário 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 o tipo de retorno (veja os comentários do BGB e do Chuck abaixo). Em comparação, uma assinatura de função de membro C ++ contém o nome da função, bem como apenas os tipos de parâmetros / retorno (sem seus nomes).
  • C ++ usa bool , true e false , Objective-C usa BOOL , YES e NO .
  • C ++ usa void* e nullptr , Objective-C prefere id e nil .
  • Objetivo-C usa "seletores" (que possuem tipo SEL ) como um equivalente aproximado a ponteiros de função.
  • Objective-C usa um paradigma de mensagens (a la Smalltalk) onde você pode enviar "mensagens" para objetos através de métodos / seletores.
  • Objective-C terá o prazer de enviar uma mensagem para nil , ao contrário de C ++, que irá falhar se você tentar chamar uma função de membro de nullptr
  • Objective-C permite o despacho dinâmico, permitindo que a classe respondendo a uma mensagem seja determinada em tempo de execução, ao contrário de C ++, onde o objeto em que um método é invocado deve ser conhecido em tempo de compilação (veja o comentário de wilhelmtell abaixo). Isso está relacionado ao ponto anterior.
  • O Objective-C permite a autogeração de acessadores para variáveis ​​membros usando "propriedades".
  • O Objective-C permite atribuir a self e permite que inicializadores de classe (semelhantes aos construtores) retornem uma classe completamente diferente, se desejado. Contraste para C ++, onde se você criar uma nova instância de uma classe (seja implicitamente na pilha ou explicitamente por meio de new ), é garantido que ela é do tipo que você especificou originalmente.
  • Da mesma forma, em Objective-C, outras classes também podem alterar dinamicamente uma classe de destino em tempo de execução para interceptar chamadas de método.
  • Objective-C não possui o recurso de namespace do C ++.
  • Objective-C carece de um equivalente a referências em C ++.
  • O Objective-C carece de templates, preferindo (por exemplo) permitir tipagem fraca em containers.
  • O Objective-C não permite sobrecarga de método implícito, mas o C ++ o faz. Ou seja, em C ++ int foo (void) e int foo (int) definem uma sobrecarga implícita do método foo , mas para alcançar o mesmo em Objective-C é necessário que as sobrecargas explícitas - (int) foo e - (int) foo:(int) intParam . Isso ocorre porque os parâmetros nomeados do Objective-C são funcionalmente equivalentes ao mangling de nomes do C ++.
  • O Objective-C permitirá que um método e uma variável compartilhem o mesmo nome, ao contrário do C ++, que geralmente possui ajustes. Eu imagino que isso é algo para fazer com Objective-C usando seletores em vez de ponteiros de função e, portanto, os nomes dos métodos não têm realmente um "valor".
  • Objetivo-C não permite que objetos sejam criados na pilha - todos os objetos devem ser alocados a partir do heap (seja explicitamente com uma mensagem de alocação ou implicitamente em um método de fábrica apropriado).
  • Como o C ++, o Objective-C possui as duas estruturas e classes. No entanto, onde em C ++ eles são tratados quase exatamente da mesma maneira, em Objective-C eles são tratados de forma 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 despacho dinâmico.

Provavelmente muitas outras coisas também que eu perdi, vou atualizar com qualquer outra coisa que eu penso. Além disso, pode altamente recomendar o guia LiraNuna apontou para você. Aliás, outro site de interesse pode ser this .

Também devo salientar que estou apenas começando a aprender Objective-C, e, como tal, muitos dos itens acima podem não estar corretos ou completos - peço desculpas se for o caso, e aceito sugestões de melhoria.

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





objective-c