¿Qué tan diferente es Objective-C de C ++? [cerrado]

171

¿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.

Alerta
fuente
2
Esta guía ofrece la mejor comparación que he visto.
LiraNuna
@Oskar Kjellin: Las respuestas de Mac y LiraNuna son excelentes respuestas. No puedo decidir objetivamente cuál es el mejor porque ambos complementan la respuesta del otro.
Alerta el
@ Muy bien, lo sé (me encuentro con eso bastante a menudo). Tal vez solo marque el primero como respondido, que es lo que hago cuando no puedo decidir. No me gusta cuando hay preguntas que no están marcadas como respondidas cuando están :(
Oskar Kjellin
1
Pon un enlace a la segunda respuesta en la primera y viceversa
Lee Taylor

Respuestas:

185

Lista breve de algunas de las principales diferencias:

  • C ++ permite la herencia múltiple, Objective-C no.
  • A diferencia de C ++, Objective-C permite nombrar los parámetros del método y la firma del método incluye solo los nombres y tipos de los parámetros y el tipo de retorno (ver los comentarios de Bbum y Chuck a continuación). En comparación, una firma de función miembro de C ++ contiene el nombre de la función, así como solo los tipos de los parámetros / retorno (sin sus nombres).
  • C ++ usa bool, truey false, Objective-C usa BOOL, YESy NO.
  • C ++ utiliza void*y nullptr, Objective-C prefiere idy nil.
  • Objective-C usa "selectores" (que tienen tipo SEL) como un equivalente aproximado a los punteros de función.
  • Objective-C utiliza un paradigma de mensajería (a la Smalltalk) donde puede enviar "mensajes" a objetos a través de métodos / selectores.
  • Objective-C felizmente le permitirá enviar un mensaje a 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.
  • Objective-C permite la autogeneración de accesores para variables miembro utilizando "propiedades".
  • Objective-C permite asignar selfy 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ícitamente new) se garantiza que será del tipo que especificó originalmente.
  • De manera similar, en Objective-C otras clases también pueden alterar dinámicamente una clase objetivo en tiempo de ejecución para interceptar llamadas a métodos.
  • Objective-C carece de la función de espacio de nombres de C ++.
  • Objective-C carece de un equivalente a las referencias de C ++.
  • Objective-C carece de plantillas, prefiriendo (por ejemplo) permitir una escritura débil en contenedores.
  • Objective-C no permite la sobrecarga de métodos implícitos, pero C ++ sí. Es decir, en C ++ int foo (void)y int foo (int)define una sobrecarga implícita del método foo, pero para lograrlo en Objective-C se requieren sobrecargas explícitas - (int) fooy - (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 ++.
  • Objective-C felizmente permitirá que un método y una variable compartan el mismo nombre, a diferencia de C ++, que generalmente tendrá ajustes. Me imagino que esto tiene algo que ver con Objective-C usando selectores en lugar de punteros de función y, por lo tanto, los nombres de métodos que en realidad no tienen un "valor".
  • Objective-C no permite que se creen objetos en la pila: todos los objetos deben asignarse desde el montón (ya sea explícitamente con un allocmensaje o implícitamente en un método de fábrica apropiado).
  • Al igual que C ++, Objective-C tiene estructuras y clases. Sin embargo, cuando en C ++ se tratan casi exactamente de la misma manera, en Objective-C se tratan de forma muy diferente: por ejemplo, puede crear estructuras en la pila.

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.

Mac
fuente
8
Lista decente; Una corrección. No son "parámetros con nombre", sino "parámetros intercalados". Los argumentos con nombre y "palabras clave" generan confusión al pensar que se puede omitir algún subconjunto del nombre del método. No puede.
bbum
77
Olvidó enlistar la diferencia más importante: Object-C usa despacho dinámico, mientras que C ++ usa despacho estático. En otras palabras, el código compilado por un compilador Objective-C tendrá la clase responsable de responder a un mensaje determinado en tiempo de ejecución; el código compilado por un compilador de C ++ tiene esta información calculada y compilada en tiempo de compilación.
wilhelmtell
9
@wilhelmtell: el compilador de C ++ solo conoce la superclase en tiempo de compilación. En tiempo de ejecución, la clase real podría ser cualquier descendiente. Esta también es una forma de despacho dinámico, pero no la misma forma que se usa en el Objetivo C. ¡Solo tenga cuidado con esos términos técnicos!
Norman Ramsey
55
+1 Buena lista. Sin embargo, Objective-C también usa void*y NULL, 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 caso NULLse usa con frecuencia.
Quinn Taylor
3
@wilhelmtell: no sé nada sobre el objetivo-C, pero en C ++ PUEDE que una clase diferente responda dinámicamente a una llamada de función, pero necesitaría tener algo así como una matriz de punteros a una clase base, y luego las clases ACTUALES que están "colgando" de él. Si bien todas las clases deben ser subclases, una llamada a un método LLAMARÁ a diferentes métodos según la clase, en tiempo de ejecución.
Kevin Anderson
33

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 ++ .

Georg Fritzsche
fuente
enlace actualizado: Objective-C ++
IcyIcicle
6

Son completamente diferentes. El objetivo C tiene más en común con Smalltalk que con C ++ (bueno, excepto por la sintaxis, en realidad).

Dean Harding
fuente
6

La parte superior de mi cabeza:

  1. Estilos: Obj-C es dinámico, C ++ es típicamente estático
  2. Aunque ambos son OOP, estoy seguro de que las soluciones serían diferentes.
  3. Modelo de objeto diferente (C ++ está restringido por su sistema de tipo de tiempo de compilación).

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.

Rev316
fuente
5

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).

Michael Ekstrand
fuente
4

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.

Foo* bar = malloc(sizeof(Foo));

C ++ no se compilará a menos que el voidpuntero se expulse explícitamente:

Foo* bar = (Foo*)malloc(sizeof(Foo));

La relevancia de esto para la programación diaria es cero, solo un divertido dato curioso.

Igor Zevaka
fuente
El segundo ejemplo no es el código C ++. Es el código C que le dio un error cuando intentó compilarlo con el compilador C ++. Si desea que C ++ antiguo 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 si auto bar = new Foo(constructorArg);realmente no necesitara malloc, y ya sea callic, puede usar std::vector::reserve, ystd::vector::emplace_mack
xakepp35
3

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 ++.

Paul Fultz II
fuente
3
Si vas a hablar de precios, ¡sé justo! Por el contrario, Obj-C es mucho más lento para resolver llamadas a métodos dinámicos en tiempo de ejecución que C ++. Y diría que la velocidad de compilación es una trivialidad relativa en comparación con la velocidad de ejecución. Estoy seguro de que Obj-C ofrece muchos beneficios debido a su envío más dinámico, pero hay una compensación allí.
underscore_d
1
Es cierto que existe una compensación entre el tiempo de ejecución y el costo del tiempo de compilación. Sin embargo, el tiempo de compilación no siempre es trivial. El uso de metaprogramaciones pesadas y bibliotecas EDSL en C ++ (como Boost.Spirit) puede tener un efecto drástico en el tiempo de compilación, al tiempo que produce un código muy rápido en tiempo de ejecución.
Paul Fultz II
1
Claro, estaba simplificando demasiado en relación con el POV de bases de código más simples ... Con bases de código muy complejas, recompilar para probar pequeños cambios podría hacer que el desarrollo sea muy tedioso, lo cual no es una trivialidad. ¿Pero es esto algo que realmente podemos comparar entre los dos? ¿Pueden tales bibliotecas, tan dependientes de las características de tiempo de compilación de C ++, reinventarse de alguna manera en Objective-C y demostrar que compilan más rápido? es decir, ¿la afirmación "Obj-C es mucho más rápido en la compilación que C ++" se refiere a bases de código equivalentes para las cuales se puede medir una aceleración replicable? De lo contrario, estamos comparando el tiempo necesario para cultivar manzanas y naranjas.
underscore_d