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

12 minutos de lectura

avatar de usuario
Alerta

¿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. Sólo quiero hechos reales y duros. De hecho, ¡mi pregunta no está relacionada con el rendimiento! Proporcione fuentes para cualquier cosa que pueda parecer subjetiva.

  • esta guía da la mejor comparación que he visto.

    – Lira Nuna

    15 de marzo de 2010 a las 4:18

  • @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

    6 de abril de 2010 a las 22:04

  • @Alerty lo sé bien (me tropiezo con eso bastante a menudo). Tal vez solo marque la primera como respondida, que es lo que hago cuando no puedo decidir. No me gusta cuando hay preguntas que no están marcadas como contestadas cuando lo están 🙁

    – Oskar Kjellin

    6 de abril de 2010 a las 22:26

  • Poner un enlace a la segunda respuesta en la primera y viceversa

    – Lee Taylor

    24 de julio de 2012 a las 14:18

avatar de usuario
Mac

Breve lista 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 (consulte 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 parámetros/retorno (sin sus nombres).
  • usos de C++ bool, true y falseObjective-C utiliza BOOL, YES y NO.
  • usos de C++ void* y nullptrObjective-C prefiere id y nil.
  • Objective-C utiliza “selectores” (que tienen tipo SEL) como un equivalente aproximado de los punteros de función.
  • Objective-C usa un paradigma de mensajería (al estilo de Smalltalk) donde puede enviar “mensajes” a objetos a través de métodos/selectores.
  • Objective-C le permitirá enviar un mensaje a nila diferencia de C++, que fallará si intenta llamar a una función miembro de nullptr
  • Objective-C permite el envío 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 (consulte 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 usando “propiedades”.
  • Objective-C permite asignar a selfy permite que los inicializadores de clase (similares a los constructores) devuelvan una clase completamente diferente si se desea. En contraste con C ++, donde si crea una nueva instancia de una clase (ya sea implícitamente en la pila o explícitamente a través de 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 de destino 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 en su lugar 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) definir una sobrecarga implícita del método foopero para lograr lo mismo en Objective-C requiere las 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 a la manipulación de nombres de C++.
  • Objective-C felizmente permitirá que un método y una variable compartan el mismo nombre, a diferencia de C++, que normalmente 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 los métodos no tienen realmente 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 alloc mensaje, o implícitamente en un método de fábrica apropiado).
  • Al igual que C++, Objective-C tiene estructuras y clases. Sin embargo, mientras que en C++ se tratan casi exactamente igual, en Objective-C se tratan de manera muy diferente: usted pueden crear estructuras en la pila, por ejemplo.

En mi opinión, probablemente la mayor diferencia es la sintaxis. Puede lograr esencialmente las mismas cosas en cualquier idioma, 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 envío dinámico.

Probablemente muchas otras cosas también me he perdido, actualizaré con cualquier otra cosa que se me ocurra. Aparte de eso, puedo recomendar encarecidamente la guía que LiraNuna le señaló. Por cierto, otro sitio de interés podría ser este.

También debo señalar que apenas estoy comenzando a aprender Objective-C y, como tal, es posible que gran parte de lo anterior no sea del todo correcto o completo. Pido disculpas si ese es el caso y agradezco sugerencias para mejorar.

EDITAR: actualizado para abordar los puntos planteados en los siguientes comentarios, se agregaron algunos elementos más a la lista.

  • lista decente; una corrección No son “parámetros con nombre”, sino “parámetros intercalados”. Los argumentos con nombre y de “palabra clave” conducen a la confusión de pensar que se puede omitir algún subconjunto del nombre del método. No puede.

    – bbum

    15 de marzo de 2010 a las 7:04

  • Se olvidó de incluir 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 de 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.

    – Guillermo Tell

    15 de marzo de 2010 a las 19:15

  • @wilhelmtell: el compilador de C++ solo conoce la superclase en el momento de la compilación. En tiempo de ejecución, la clase real podría ser cualquier descendiente. Esta también es una forma de envío dinámico, pero no es la misma forma que se usa en Objective C. ¡Solo tenga cuidado con esos términos técnicos!

    —Norman Ramsey

    16 de marzo de 2010 a las 1:15

  • +1 Buena lista. Sin embargo, Objective-C también usa void* y NULL, pero no para los 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 NULL se usa con frecuencia.

    – QuinnTaylor

    16 de marzo de 2010 a las 2:49

  • @wilhelmtell: no sé nada sobre Objective-C, pero en C ++ puede hacer que una clase diferente responda dinámicamente a una llamada de función, pero necesitaría tener algo como una matriz de punteros a una clase base, y luego las clases REALES que están “colgando” de él. Si bien todas las clases deben tener subclases, una llamada de método llamará a diferentes métodos según la clase, en tiempo de ejecución.

    –Kevin Anderson

    16 de marzo de 2010 a las 22:36

avatar de usuario
Jorge Fritzsche

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 envío 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 encuentra en las decisiones estáticas de tiempo de compilación.

Con respecto a las bibliotecas, puede usar bibliotecas C simples en ambos idiomas, pero sus bibliotecas nativas son completamente diferentes.

Sin embargo, es interesante que puede mezclar ambos idiomas (con algunas limitaciones). El resultado se llama Objetivo-C++.

  • enlace actualizado: Objetivo-C++

    – IcyIcicle

    30 de junio de 2020 a las 5:19

La parte superior de mi cabeza:

  1. Estilos: Obj-C es dinámico, C ++ suele ser 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 tipos en tiempo de compilación).

Para mí, la mayor diferencia es el sistema modelo. Obj-C le permite enviar mensajes e introspección, pero C ++ tiene las plantillas siempre tan poderosas.

Cada uno tiene sus puntos fuertes.

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

Como han dicho otros, 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 “estándar”, que no son C++. Mucho envío dinámico, sin sobrecarga de operadores, envío de mensajes.

C++ es su propio animal extraño; en su mayoría se saltó la porción de Smalltalk del árbol genealógico. De alguna manera, tiene un buen sistema de módulos con soporte para herencia que puede usarse para programación orientada a objetos. Las cosas son mucho más estáticas (por ejemplo, los métodos reemplazables no son los predeterminados).

avatar de usuario
Igor Zevaka

Objective-C es un superconjunto más perfecto de C. En C y Objective-C conversión implícita de void* a un puntero de estructura está permitido.

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

C++ no compilará a menos que el void el puntero se lanza explícitamente:

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

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

avatar de usuario
Pablo Fultz II

Obj-C tiene capacidades mucho más dinámicas en el propio lenguaje, mientras que C++ se centra más en las capacidades de tiempo de compilación con algunas capacidades dinámicas.

En C++, el polimorfismo paramétrico 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 observar las clases. En C++, la definición de clase no puede cambiar y toda la introspección debe realizarse 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í), aún es más detallada que en Obj-C.

En C++, hay muchas más comprobaciones que se pueden realizar en tiempo de compilación. Por ejemplo, al usar un tipo de variante (como una unión), el compilador puede exigir que todos los casos se escriban o manejen. Así que 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 para compilar que C++.

  • Si vas a hablar de precios, ¡sé justo! Por el contrario, Obj-C es mucho más lento para resolver llamadas de 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 ahí hay una compensación.

    – subrayado_d

    31 de julio de 2016 a las 17:04


  • 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 bibliotecas EDSL y de metaprogramación pesada 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 de agosto de 2016 a las 11:15

  • Claro, estaba simplificando demasiado en relación con el punto de vista de bases de código más simples… Con bases de código muy complejas, volver a compilar para probar pequeños cambios puede hacer que el desarrollo sea muy tedioso, lo cual no es una trivialidad. Pero, ¿es esto algo que realmente podamos comparar entre los dos? ¿Pueden tales bibliotecas, tan dependientes de las funciones 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 declaración “Obj-C es mucho más rápido para compilar 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 frente a naranjas.

    – subrayado_d

    1 de agosto de 2016 a las 11:26


¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad