¿Cuáles son las principales diferencias entre Objective-C y C ++ en términos de sintaxis, características, paradigmas, marcos y bibliotecas?
* Importante: mi objetivo no es iniciar una guerra de rendimiento entre los dos idiomas. Solo quiero hechos reales y duros. De hecho, mi pregunta no está relacionada con el rendimiento. Proporcione fuentes para cualquier cosa que pueda parecer subjetiva.
c++
objective-c
Alerta
fuente
fuente
Respuestas:
Lista breve de algunas de las principales diferencias:
bool
,true
yfalse
, Objective-C usaBOOL
,YES
yNO
.void*
ynullptr
, Objective-C prefiereid
ynil
.SEL
) como un equivalente aproximado a los punteros de función.nil
, a diferencia de C ++ que se bloqueará si intenta llamar a una función miembro denullptr
Objective-C permite el despacho dinámico, lo que permite que la clase que responde a un mensaje se determine en tiempo de ejecución, a diferencia de C ++, donde el objeto sobre el que se invoca un método debe conocerse en tiempo de compilación (ver el comentario de wilhelmtell a continuación). Esto está relacionado con el punto anterior.self
y permite que los inicializadores de clase (similares a los constructores) devuelvan una clase completamente diferente si lo desean. Contraste con C ++, donde si crea una nueva instancia de una clase (ya sea implícitamente en la pila o explícitamentenew
) se garantiza que será del tipo que especificó originalmente.int foo (void)
yint foo (int)
define una sobrecarga implícita del métodofoo
, pero para lograrlo en Objective-C se requieren sobrecargas explícitas- (int) foo
y- (int) foo:(int) intParam
. Esto se debe a que los parámetros con nombre de Objective-C son funcionalmente equivalentes al cambio de nombre de C ++.alloc
mensaje o implícitamente en un método de fábrica apropiado).En mi opinión, probablemente la mayor diferencia es la sintaxis. Puede lograr esencialmente las mismas cosas en cualquier lenguaje, pero en mi opinión la sintaxis de C ++ es más simple, mientras que algunas de las características de Objective-C facilitan ciertas tareas (como el diseño de GUI) gracias al despacho dinámico.
Probablemente hay muchas otras cosas que también me he perdido, actualizaré con cualquier otra cosa que piense. Aparte de eso, puedo recomendar la guía que LiraNuna te señaló. Por cierto, otro sitio de interés podría ser este .
También debo señalar que estoy empezando a aprender Objective-C, y como tal, muchas de las anteriores pueden no ser correctas o completas. Me disculpo si ese es el caso, y agradezco las sugerencias de mejora.
EDITAR: actualizado para abordar los puntos planteados en los siguientes comentarios, agregó algunos elementos más a la lista.
fuente
void*
yNULL
, simplemente no para objetos. Puede usar cualquier puntero de estilo C en Obj-C, y muchas llamadas API realmente pasan o devuelven valores por referencia, en cuyo casoNULL
se usa con frecuencia.Si bien ambos están enraizados en C, son dos lenguajes completamente diferentes.
Una diferencia importante es que Objective-C se centra en las decisiones de tiempo de ejecución para el despacho y depende en gran medida de su biblioteca de tiempo de ejecución para manejar la herencia y el polimorfismo, mientras que en C ++ el enfoque generalmente se basa en decisiones estáticas y de tiempo de compilación.
Con respecto a las bibliotecas, puede usar bibliotecas C simples en ambos lenguajes, pero sus bibliotecas nativas son completamente diferentes.
Sin embargo, es interesante que pueda mezclar ambos idiomas (con algunas limitaciones). El resultado se llama Objective-C ++ .
fuente
Son completamente diferentes. El objetivo C tiene más en común con Smalltalk que con C ++ (bueno, excepto por la sintaxis, en realidad).
fuente
La parte superior de mi cabeza:
Para mí, la mayor diferencia es el sistema modelo. Obj-C le permite hacer mensajes e introspección, pero C ++ tiene las plantillas cada vez más potentes.
Cada uno tiene sus puntos fuertes.
fuente
Como otros han dicho, Objective-C es mucho más dinámico en términos de cómo piensa en los objetos frente al reino bastante estático de C ++.
Objective-C, al estar en el linaje Smalltalk de lenguajes orientados a objetos, tiene un concepto de objetos que es muy similar al de Java, Python y otros lenguajes orientados a objetos no estándar de C ++. Un montón de despacho dinámico, sin sobrecarga del operador, envía mensajes.
C ++ es su propio animal extraño; omitió principalmente la porción Smalltalk del árbol genealógico. De alguna manera, tiene un buen sistema de módulos con soporte para herencia que puede utilizarse para programación orientada a objetos. Las cosas son mucho más estáticas (los métodos reemplazables no son los predeterminados, por ejemplo).
fuente
Objective-C es un superconjunto más perfecto de C. En C y Objective-C se permite la conversión implícita de
void*
un puntero de estructura.C ++ no se compilará a menos que el
void
puntero se expulse explícitamente:La relevancia de esto para la programación diaria es cero, solo un divertido dato curioso.
fuente
Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));
sea lo más parecido al original, escribiría y quizás usaría un constructor in situ. Pero a partir de hoy, su C ++ moderno es más como siauto bar = new Foo(constructorArg);
realmente no necesitara malloc, y ya sea callic, puede usarstd::vector::reserve
, ystd::vector::emplace_mack
Obj-C tiene capacidades mucho más dinámicas en el lenguaje mismo, mientras que C ++ está más enfocado en capacidades de tiempo de compilación con algunas capacidades dinámicas.
En, el polimorfismo paramétrico C ++ se verifica en tiempo de compilación, mientras que en Obj-C, el polimorfismo paramétrico se logra a través del despacho dinámico y no se verifica en tiempo de compilación.
Obj-C es de naturaleza muy dinámica. Puede agregar métodos a una clase durante el tiempo de ejecución. Además, tiene introspección en tiempo de ejecución para mirar las clases. En C ++, la definición de clase no puede cambiar, y toda introspección debe hacerse en tiempo de compilación. Aunque, la naturaleza dinámica de Obj-C podría lograrse en C ++ usando un mapa de funciones (o algo así), todavía es más detallado que en Obj-C.
En C ++, hay muchas más comprobaciones que se pueden hacer en tiempo de compilación. Por ejemplo, usando un tipo de variante (como una unión) el compilador puede exigir que todos los casos se escriban o manejen. Por lo tanto, no se olvide de manejar los casos extremos de un problema. Sin embargo, todos estos controles tienen un precio al compilar. Obj-C es mucho más rápido en la compilación que C ++.
fuente