web-dev-qa-db-fra.com

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

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

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

163
Alerty

Petite liste de certaines des principales différences:

  • C++ permet l'héritage multiple, contrairement à Objective-C.
  • Contrairement à C++, Objective-C permet de nommer les paramètres de méthode et la signature de méthode n'inclut que les noms et types de 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/return (sans leur nom).
  • C++ utilise bool, true et false, Objective-C utilise BOOL, YES et NO.
  • C++ utilise void* et nullptr, Objective-C préfère id et nil.
  • Objective-C utilise des "sélecteurs" (de type SEL) comme équivalents approximatifs des pointeurs de fonction.
  • Objective-C utilise un paradigme de messagerie (à la Smalltalk) dans lequel vous pouvez envoyer des "messages" à des objets par le biais de méthodes/sélecteurs.
  • Objective-C vous laissera volontiers envoyer un message à nil, contrairement à C++, qui plantera si vous essayez d'appeler une fonction membre de nullptr
  • Objective-C permet la répartition dynamique, permettant à la classe répondant à un message d'être déterminée au moment de 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’assigner à self et aux initialiseurs de classes (similaires aux constructeurs) de renvoyer une classe complètement différente si nécessaire. Contraste avec C++, où, si vous créez une nouvelle instance d'une classe (soit implicitement sur la pile, soit explicitement via new), son type est garanti.
  • De même, dans Objective-C, d'autres classes peuvent également modifier de façon dynamique 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 manque d'un équivalent aux références C++.
  • Objective-C manque de modèles, préférant (par exemple) autoriser le typage faible dans les conteneurs.
  • Objective-C n'autorise pas la surcharge de méthodes implicite, contrairement à C++. En d’autres termes, en C++, int foo (void) et int foo (int) définissent une surcharge implicite de la méthode foo, mais pour atteindre le même objectif en C, les surcharges explicites - (int) foo et - (int) foo:(int) intParam. Cela est dû au fait que les paramètres nommés d'Objective-C sont fonctionnellement équivalents à ceux de C++.
  • Objective-C permettra volontiers à une méthode et à une variable de partager le même nom, contrairement à C++ qui aura généralement des ajustements. J'imagine que cela a quelque chose à voir avec Objective-C qui utilise des sélecteurs au lieu de pointeurs de fonction, et donc les 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 message alloc, soit implicitement avec une méthode de fabrique appropriée).
  • Comme C++, Objective-C possède à la fois des structures et des classes. Cependant, là où, en C++, ils sont traités presque exactement de la même manière, 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 aussi que j'ai manquées, je vais mettre à jour avec d'autres choses que je pense. Sinon, je vous recommande vivement le guide que LiraNuna vous a indiqué. Incidemment, un autre site d'intérêt pourrait être this .

Je devrais également souligner que je commence tout juste à apprendre Objective-C moi-même et que, par conséquent, une grande partie de ce qui précède peut ne pas être tout à fait correcte ou complète. Je m'excuse si c'est le cas et je salue les suggestions d'amélioration.

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

176
Mac

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

Une différence majeure réside dans le fait qu'Objective-C est centré sur les décisions d'exécution relatives à la répartition et dépend fortement de sa bibliothèque d'exécution pour gérer l'héritage et le polymorphisme, alors qu'en C++, l'accent est généralement mis sur les décisions statiques, de compilation.

En ce qui concerne les bibliothèques, vous pouvez utiliser les bibliothèques en clair C 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 s'appelle Objective-C++ .

32
Georg Fritzsche

Ils sont complètement différents. L’objectif C a plus en commun avec Smalltalk qu’avec C++ (enfin, à l’exception de la syntaxe, en réalité).

7
Dean Harding

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 types à la compilation).

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

Chacun a ses points forts.

7
Rev316

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

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

C++ ne compilera que si le pointeur void est explicitement converti:

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

La pertinence de ceci pour la programmation de tous les jours est zéro, juste une anecdote amusante.

6
Igor Zevaka

Comme d'autres l'ont dit, Objective-C est beaucoup plus dynamique en ce qui concerne la façon dont il conçoit les objets par rapport au domaine relativement statique de C++.

Objective-C, appartenant à la lignée Smalltalk des langages orientés objet, a un concept d’objets très similaire à celui de Java, Python et d’autres langages "standard" orientés objet non C++. Beaucoup de dispatch dynamique, pas de surcharge de l'opérateur, envoi de messages.

C++ est son propre animal étrange; il a surtout ignoré la partie Smalltalk de l'arbre généalogique. À certains égards, il dispose d’un bon système de modules prenant en charge 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 les méthodes par défaut, par exemple).

6
Michael Ekstrand

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

En C++, le polymorphisme paramétrique est vérifié au moment de la compilation, tandis que dans Obj-C, le polymorphisme paramétrique est obtenu via une 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 l'introspection au moment de l'exécution d'examiner les classes. En C++, la définition de 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++ à l’aide d’une carte de fonctions (ou quelque chose du genre), elle est toujours plus détaillée que dans Obj-C.

En C++, beaucoup plus de contrôles peuvent être effectués 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. Ainsi, vous n’oubliez pas de traiter les cas Edge d’un problème. Cependant, tous ces contrôles ont un prix lors de la compilation. Obj-C est beaucoup plus rapide à compiler que C++.

4
Paul Fultz II