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.
c++
objective-c
Alerty
fonte
fonte
Respostas:
Pequena lista de algumas das principais diferenças:
bool
,true
efalse
, Objective-C usaBOOL
,YES
eNO
.void*
enullptr
, Objective-C prefereid
enil
.SEL
) como um equivalente aproximado aos ponteiros de função.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.self
e 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 explicitamentenew
), é garantido que seja do tipo que você especificou originalmente.int foo (void)
eint foo (int)
definir uma sobrecarga implícita do métodofoo
, mas para obter o mesmo em Objective-C, são necessárias 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 nome do C ++.alloc
mensagem ou implicitamente em um método de fábrica apropriado).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.
fonte
void*
eNULL
, 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.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 ++ .
fonte
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).
fonte
Em cima da minha cabeça:
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.
fonte
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).
fonte
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.O C ++ não será compilado, a menos que o
void
ponteiro seja explicitamente convertido:A relevância disso para a programação diária é zero, apenas um fato curioso.
fonte
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
então talvez usar construtor inplace .. Mas a partir de hoje o seu Modern C ++ é mais comoauto bar = new Foo(constructorArg);
na verdade você não precisa malloc, e quer callic, você pode usarstd::vector::reserve
, estd::vector::emplace_mack
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 ++.
fonte