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
, true
e false
, Objective-C usa BOOL
, YES
e NO
.
- C ++ usa
void*
e nullptr
, Objective-C prefere id
e 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
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 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) foo
e - (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
alloc
mensagem 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.