Objetivo c vs c ++

Muito, muito diferente. Tão diferente de fato que você pode misturar Objective C e C ++ sem sobreposição (embora a sintaxe da propriedade dot possa ser confusa).

Na época em que C estava substituindo Pascal por escrever software de microcomputador, as pessoas se interessaram em fazer algum trabalho com objetos. Havia duas maneiras óbvias de seguir:

  1. Tente basear estruturas em algo semelhante a objetos usando ponteiros de função.
  2. Escreva um sistema de objetos completamente separado e deixe C chamá-lo.

O C ++ começou com a abordagem 1, usando inicialmente um pré-processador para converter em código C simples, mas eventualmente colocando os bits de classe na própria linguagem. O objetivo C começou com a abordagem 2, colocando também um mecanismo de invocação do tipo Smalltalk no idioma.

Bem diferente. Ambas as linguagens são superconjuntos de C e adicionaram suporte à programação orientada a objetos, mas é aí que a semelhança termina.

O objetivo C adiciona uma fina camada de polimorfismo de passagem de mensagens inspirado no Smalltalk, em que os objetos apontam para tabelas hash de métodos que são pesquisados ​​dinamicamente em tempo de execução.

O C ++ possui um suporte mais elaborado (e complexo) ao polimorfismo - principalmente estático - em que todas as referências de métodos são resolvidas em tempo de compilação, possivelmente por meio de uma tabela virtual indireta. Na minha opinião, o C ++ possui uma sintaxe e um design mais consistentes, e o suporte a modelos permitiu o desenvolvimento de STL, Boost e outras bibliotecas que oferecem funcionalidade incrível e desempenho superior.

Eles são semelhantes em seus tipos primitivos, no uso de ponteiros, em seu conjunto de operadores, no fato de que ambos têm o conceito de classes, herança múltipla, mestres e instâncias e nos tipos primitivos (exceto o id, que é um tipo dinâmico) , e os tipos de usuário são fortemente digitados. A Apple recentemente adicionou o conceito de tipos genéricos ao Obj-C, que são análogos aos modelos em C ++. As diferenças estão em como os métodos são chamados e o fato de o Objetivo C não suportar sobrecarga do operador.

Com o C ++, espera-se que todas as instâncias de classe residam em uma única imagem de programa. O Obj-C tem algo mais próximo dos objetos verdadeiros, no sentido de que eles podem atuar como servidores. Eles podem existir independentemente de um programa em execução (embora entrem em um estado inativo se nenhum programa os estiver usando). Funcionam um pouco como bibliotecas vinculadas dinamicamente, exceto que seu estado também pode ser serializado e revivido quando voltarem a ser utilizados. C ++ vincula todas as chamadas de método em tempo de compilação. No Obj-C, o envio do método ocorre em tempo de execução. Assim, as chamadas de método também podem ser geradas dinamicamente em tempo de execução. Além disso, as mensagens podem ser redirecionadas dinamicamente de um objeto para outro em tempo de execução. No C ++, todos os métodos existem como funções dentro de classes, com um nome de função, uma lista de parâmetros e um tipo de retorno. No Obj-C, os métodos são compostos por cabeçalhos, que são um conjunto de palavras-chave que têm tipos associados a eles e um tipo de retorno. Em outras palavras, não há nome para o método. É conhecido apenas por sua interface e seus tipos. Isto é seguido por uma sequência de operações em bloco, semelhante a uma função C ++.

O Objetivo C e C ++ não são muito semelhantes, além de serem compilados, linguagens orientadas a objetos derivadas de C. Acho que o Objetivo C é realmente mais semelhante ao Java em termos de práticas de programação.

Aqui estão minhas principais diferenças entre C ++ e Objective C:

Sintaxe Na minha opinião, o Objetivo C tem uma sintaxe muito estranha. A maioria das linguagens de programação que conheço usam object.method (argumentos) para chamadas de método. O objetivo C tinha que "Pensar diferente" e usar [método do objeto: arg1 continuName: arg2]. Além disso, interfaces, propriedades, classes e outras partes da criação de uma classe são declaradas com a diretiva "@" (@property, @interface, etc.).

A maneira como você pensa sobre os ponteiros No Objetivo C, os ponteiros definitivamente existem, mas você não precisa realmente pensar neles. Você está tecnicamente passando todos os objetos como ponteiro, mas apenas especifica que é um ponteiro para um objeto na declaração. Quando você insere o objeto em um método, tecnicamente você está passando um ponteiro para ele. Você não usa "&" para dizer "endereço de ___" como em C ++, apenas digita o nome do objeto.

O Objetivo C de Gerenciamento de Memória possui uma coisa muito interessante chamada ARC (Automatic Reference Counting). O ARC basicamente mantém uma contagem do número de ponteiros para um objeto e o exclui quando essa contagem chega a 0. Acho que é uma maneira muito boa de gerenciamento automático de memória, porque é bastante fácil programar em torno dele (principalmente porque o como o ARC funciona pode ser facilmente racionalizado). Não me interpretem mal, você pode codificar no Objective C sem a coleta automática de lixo em C ++, mas isso facilita a vida. O ARC vem com algumas peculiaridades, como ter ponteiros "fortes" e "fracos" para objetos que são propriedades de outros.

Essas são as minhas grandes coisas. Como Eric Pepke disse, você pode escrever Objective C e C ++ no mesmo arquivo, e o compilador pode dizer a diferença entre os dois porque a sintaxe é muito diferente. Por outro lado, as partes compartilhadas das línguas, principalmente a fundação C, são tratadas da mesma maneira em ambas. Isso se chama Objective C ++ e eu realmente escrevi um aplicativo para iPhone usando-o. Eu o usei apenas porque escrevi anteriormente um algoritmo em C ++ que não queria converter para o Objetivo C. Aconselho não usar o Objective C ++ porque é um problema na interface entre as duas linguagens, porque você precisa reinicializar objetos no outra língua.

Espero que ajude.