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.
c++
objective-c
Alerty
la source
la source
Réponses:
Petite liste de quelques-unes des principales différences:
bool
,true
etfalse
, Objective-C utiliseBOOL
,YES
etNO
.void*
etnullptr
, Objective-C préfèreid
etnil
.SEL
) comme équivalent approximatif des pointeurs de fonction.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.self
et 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 vianew
), elle est garantie d'être du type que vous avez spécifié à l'origine.int foo (void)
etint foo (int)
définir une surcharge implicite de la méthodefoo
, mais pour obtenir la même chose en Objective-C, il faut 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 à la modification des noms de C ++.alloc
message, soit implicitement dans 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 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.
la source
void*
etNULL
, 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 casNULL
est fréquemment utilisé.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 ++ .
la source
Ils sont complètement différents. Objective C a plus en commun avec Smalltalk qu'avec C ++ (enfin, sauf pour la syntaxe, vraiment).
la source
Du haut de ma tête:
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.
la source
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).
la source
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.C ++ ne compilera que si le
void
pointeur est explicitement casté:La pertinence de cela pour la programmation quotidienne est nulle, juste un fait trivial amusant.
la source
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 queauto bar = new Foo(constructorArg);
vous n'avez pas besoin de malloc, et soit de callic, vous pouvez utiliserstd::vector::reserve
, etstd::vector::emplace_mack
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 ++.
la source