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.
Petite liste de certaines des principales différences:
bool
, true
et false
, Objective-C utilise BOOL
, YES
et NO
.void*
et nullptr
, Objective-C préfère id
et nil
.SEL
) comme équivalents approximatifs des pointeurs de fonction.nil
, contrairement à C++, qui plantera si vous essayez d'appeler une fonction membre de nullptr
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.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++.alloc
, soit implicitement avec une méthode de fabrique appropriée).À 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.
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++ .
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é).
Du haut de ma tête:
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.
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.
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).
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++.