Quelle est la différence entre Objective-C et C ++? [fermé]


171

Quelles sont les principales différences entre Objective-C et C ++ en termes de syntaxe, de fonctionnalités, de paradigmes, de frameworks et de bibliothèques?

* Important: mon objectif n'est pas de déclencher une guerre des performances entre les deux langues. Je ne veux que des faits réels. En fait, ma question n'est pas liée à la performance! Veuillez donner des sources pour tout ce qui peut sembler subjectif.


2
Ce guide donne la meilleure comparaison que j'ai vue.
LiraNuna

@Oskar Kjellin: Les réponses de Mac et de LiraNuna sont toutes deux d'excellentes réponses. Je ne peux pas décider objectivement lequel est le meilleur parce que les deux se complètent mutuellement.
Alerty

@Alerty bien je sais (j'y tombe assez souvent moi-même). Peut-être marquez-vous simplement la réponse du haut, ce que je fais quand je ne peux pas décider. Je n'aime pas quand il y a des questions sans réponse quand elles le sont :(
Oskar Kjellin

1
Mettre un lien vers la deuxième réponse dans la première et vice / versa
Lee Taylor

Réponses:


185

Petite liste de quelques-unes des principales différences:

  • C ++ permet l'héritage multiple, Objective-C ne le fait pas.
  • Contrairement au C ++, Objective-C permet de nommer les paramètres de méthode et la signature de méthode inclut uniquement les noms et types des paramètres et le type de retour (voir les commentaires de bbum et Chuck ci-dessous). En comparaison, une signature de fonction membre C ++ contient le nom de la fonction ainsi que les types des paramètres / retour (sans leurs noms).
  • C ++ utilise bool, trueet false, Objective-C utilise BOOL, YESet NO.
  • C ++ utilise void*et nullptr, Objective-C préfère idet nil.
  • Objective-C utilise des "sélecteurs" (qui ont un type SEL) comme équivalent approximatif des pointeurs de fonction.
  • Objective-C utilise un paradigme de messagerie (à la Smalltalk) où vous pouvez envoyer des «messages» aux objets via des méthodes / sélecteurs.
  • Objective-C vous permettra volontiers d'envoyer un message à nil, contrairement à C ++ qui plantera si vous essayez d'appeler une fonction membre denullptr
  • Objective-C permet une répartition dynamique, permettant à la classe répondant à un message d'être déterminée à l'exécution, contrairement à C ++ où l'objet sur lequel une méthode est invoquée doit être connu au moment de la compilation (voir le commentaire de wilhelmtell ci-dessous). Ceci est lié au point précédent.
  • Objective-C permet la génération automatique d'accesseurs pour les variables membres à l'aide de "propriétés".
  • Objective-C permet d'attribuer selfet permet aux initialiseurs de classe (similaires aux constructeurs) de renvoyer une classe complètement différente si on le souhaite. Contrairement à C ++, où si vous créez une nouvelle instance d'une classe (soit implicitement sur la pile, soit explicitement via new), elle est garantie d'être du type que vous avez spécifié à l'origine.
  • De même, en Objective-C, d'autres classes peuvent également modifier dynamiquement une classe cible au moment de l'exécution pour intercepter les appels de méthode.
  • Objective-C n'a pas la fonctionnalité d'espace de noms de C ++.
  • Objective-C n'a pas d'équivalent aux références C ++.
  • Objective-C manque de modèles, préférant (par exemple) permettre à la place une saisie faible dans les conteneurs.
  • Objective-C n'autorise pas la surcharge de méthode implicite, contrairement à C ++. Autrement dit, en C ++ int foo (void)et int foo (int)définir une surcharge implicite de la méthode foo, mais pour obtenir la même chose en Objective-C, il faut les surcharges explicites - (int) fooet - (int) foo:(int) intParam. Cela est dû au fait que les paramètres nommés d'Objective-C sont fonctionnellement équivalents à la modification des noms de C ++.
  • Objective-C autorisera volontiers une méthode et une variable à partager le même nom, contrairement au C ++ qui aura généralement des ajustements. J'imagine que c'est quelque chose à voir avec Objective-C en utilisant des sélecteurs au lieu de pointeurs de fonction, et donc des noms de méthodes n'ayant pas réellement de "valeur".
  • Objective-C n'autorise pas la création d'objets sur la pile - tous les objets doivent être alloués à partir du tas (soit explicitement avec un allocmessage, soit implicitement dans une méthode de fabrique appropriée).
  • Comme C ++, Objective-C a à la fois des structures et des classes. Cependant, là où ils sont traités en C ++ comme presque exactement les mêmes, en Objective-C, ils sont traités de manière très différente - vous pouvez créer des structures sur la pile, par exemple.

À mon avis, la plus grande différence est probablement la syntaxe. Vous pouvez réaliser essentiellement les mêmes choses dans les deux langues, mais à mon avis, la syntaxe C ++ est plus simple tandis que certaines fonctionnalités d'Objective-C facilitent certaines tâches (telles que la conception d'interface graphique) grâce à la répartition dynamique.

Probablement beaucoup d'autres choses que j'ai manquées, je vais mettre à jour avec toutes les autres choses auxquelles je pense. En dehors de cela, je peux fortement recommander le guide que LiraNuna vous a indiqué. Incidemment, un autre site d'intérêt pourrait être celui-ci .

Je dois également souligner que je commence tout juste à apprendre l'Objective-C moi-même, et qu'en tant que tel, beaucoup de ce qui précède peut ne pas être tout à fait correct ou complet - je m'excuse si c'est le cas, et j'apprécie les suggestions d'amélioration.

EDIT: mis à jour pour aborder les points soulevés dans les commentaires suivants, ajouté quelques éléments supplémentaires à la liste.


8
Liste décente; une correction. Ce ne sont pas des "paramètres nommés", mais des "paramètres entrelacés". Les arguments nommés et «mots-clés» conduisent à la confusion de penser qu'un sous-ensemble du nom de la méthode peut être omis. Ça ne peut pas.
bbum

7
Vous avez oublié d'inscrire la différence la plus importante: Object-C utilise la répartition dynamique, tandis que C ++ utilise la répartition statique. En d'autres termes, le code compilé par un compilateur Objective-C aura la classe responsable de répondre à un message déterminé lors de l'exécution; code compilé par un compilateur C ++ a ces informations calculées et compilées au moment de la compilation.
wilhelmtell

9
@wilhelmtell: Le compilateur C ++ ne connaît que la superclasse au moment de la compilation. Au moment de l'exécution, la classe réelle peut être n'importe quel descendant. C'est aussi une forme d'envoi dynamique, mais pas la même forme que celle utilisée dans l'Objectif C. Faites juste attention à ces termes techniques!
Norman Ramsey

5
+1 Bonne liste. Cependant, Objective-C utilise également void*et NULL, mais pas pour les objets. Vous pouvez utiliser n'importe quel pointeur de style C dans Obj-C, et de nombreux appels d'API transmettent ou renvoient des valeurs par référence, auquel cas NULLest fréquemment utilisé.
Quinn Taylor

3
@wilhelmtell - Je ne sais rien sur objective-C, mais en C ++, vous POUVEZ faire en sorte qu'une classe différente réponde dynamiquement à un appel de fonction, mais vous auriez besoin d'avoir quelque chose comme un tableau de pointeurs vers une classe de base, puis les classes ACTUAL qui sont "suspendus" hors de lui. Alors que toutes les classes doivent être sous-classes, un appel de méthode appellera différentes méthodes selon la classe, au moment de l'exécution.
Kevin Anderson

33

Bien qu'ils soient tous deux enracinés en C, ce sont deux langages complètement différents.

Une différence majeure est qu'Objective-C se concentre sur les décisions d'exécution pour la distribution et dépend fortement de sa bibliothèque d'exécution pour gérer l'héritage et le polymorphisme, tandis qu'en C ++, l'accent est généralement mis sur les décisions statiques, au moment de la compilation.

En ce qui concerne les bibliothèques, vous pouvez utiliser des bibliothèques C simples dans les deux langues - mais leurs bibliothèques natives sont complètement différentes.

Il est intéressant de noter que vous pouvez mélanger les deux langues (avec certaines limitations). Le résultat est appelé Objective-C ++ .


lien mis à jour: Objective-C ++
IcyIcicle

6

Ils sont complètement différents. Objective C a plus en commun avec Smalltalk qu'avec C ++ (enfin, sauf pour la syntaxe, vraiment).


6

Du haut de ma tête:

  1. Styles - Obj-C est dynamique, C ++ est généralement statique
  2. Bien qu'ils soient tous les deux OOP, je suis certain que les solutions seraient différentes.
  3. Modèle d'objet différent (C ++ est limité par son système de type à la compilation).

Pour moi, la plus grande différence est le système de modèles. Obj-C vous permet de faire de la messagerie et de l'introspection, mais C ++ a les modèles toujours aussi puissants.

Chacun a ses atouts.


5

Comme d'autres l'ont dit, Objective-C est beaucoup plus dynamique en termes de perception des objets par rapport au domaine assez statique de C ++.

Objective-C, étant dans la lignée Smalltalk des langages orientés objet, a un concept d'objets qui est très similaire à celui de Java, Python et d'autres langages orientés objet "standard", non C ++. Beaucoup de répartition dynamique, pas de surcharge d'opérateur, envoyer des messages.

C ++ est son propre animal étrange; il a principalement ignoré la partie Smalltalk de l'arbre généalogique. D'une certaine manière, il dispose d'un bon système de modules avec prise en charge de l'héritage qui peut être utilisé pour la programmation orientée objet. Les choses sont beaucoup plus statiques (les méthodes remplaçables ne sont pas la valeur par défaut, par exemple).


4

Objective-C est un sur-ensemble plus parfait de C. En C et Objective-C, la conversion implicite de void*vers un pointeur de structure est autorisée.

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

C ++ ne compilera que si le voidpointeur est explicitement casté:

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

La pertinence de cela pour la programmation quotidienne est nulle, juste un fait trivial amusant.


Le deuxième exemple n'est pas du code C ++. C'est le code C qui vous a donné une erreur lorsque vous avez essayé de le compiler avec le compilateur C ++. Si vous voulez que l'ancien C ++ soit aussi proche de l'original, vous Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));écririez alors peut-être utiliser le constructeur inplace. Mais à partir d'aujourd'hui, son C ++ moderne ressemble plus à ce que auto bar = new Foo(constructorArg);vous n'avez pas besoin de malloc, et soit de callic, vous pouvez utiliser std::vector::reserve, etstd::vector::emplace_mack
xakepp35

3

Obj-C a des capacités beaucoup plus dynamiques dans le langage lui-même, tandis que C ++ est plus axé sur les capacités de compilation avec certaines capacités dynamiques.

Dans, le polymorphisme paramétrique C ++ est vérifié au moment de la compilation, tandis que dans Obj-C, le polymorphisme paramétrique est obtenu par répartition dynamique et n'est pas vérifié au moment de la compilation.

Obj-C est de nature très dynamique. Vous pouvez ajouter des méthodes à une classe pendant l'exécution. En outre, il a une introspection au moment de l'exécution pour regarder les classes. En C ++, la définition de la classe ne peut pas changer, et toute introspection doit être effectuée au moment de la compilation. Bien que la nature dynamique d'Obj-C puisse être obtenue en C ++ en utilisant une carte de fonctions (ou quelque chose comme ça), elle est encore plus verbeuse qu'en Obj-C.

En C ++, il y a beaucoup plus de vérifications qui peuvent être effectuées au moment de la compilation. Par exemple, en utilisant un type variant (comme une union), le compilateur peut imposer que tous les cas soient écrits ou traités. N'oubliez donc pas de gérer les cas extrêmes d'un problème. Cependant, tous ces contrôles ont un prix lors de leur compilation. Obj-C est beaucoup plus rapide à la compilation que C ++.


3
Si vous parlez de prix, soyez juste! Inversement, Obj-C est beaucoup plus lent à résoudre les appels de méthodes dynamiques à l'exécution que C ++. Et je dirais que la vitesse de compilation est une relative trivialité par rapport à la vitesse d'exécution. Je suis sûr qu'Obj-C offre de nombreux avantages en raison de sa répartition plus dynamique, mais il y a un compromis à faire.
underscore_d

1
Certes, il y a un compromis entre le temps d'exécution et le coût du temps de compilation. Cependant, le temps de compilation n'est pas toujours trivial. L'utilisation d'une métaprogrammation lourde et de bibliothèques EDSL en C ++ (telles que Boost.Spirit) peut avoir un effet drastique sur le temps de compilation, tout en produisant du code très rapide à l'exécution.
Paul Fultz II

1
Bien sûr, je simplifiais à l'extrême par rapport au point de vue des bases de code plus simples ... Avec des bases de code très complexes, recompiler pour tester de petits changements pouvait rendre le développement très fastidieux, ce qui n'est pas une trivialité. Mais est-ce quelque chose que nous pouvons vraiment comparer entre les deux? De telles bibliothèques, si dépendantes des fonctionnalités de compilation C ++, peuvent-elles être en quelque sorte réinventées en Objective-C et se compiler plus rapidement? c'est-à-dire que l'instruction "Obj-C est beaucoup plus rapide à la compilation que C ++" fait référence à des bases de code équivalentes pour lesquelles une accélération réplicable peut être mesurée? Sinon, nous comparons le temps nécessaire pour faire pousser des pommes et des oranges.
underscore_d
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.