C ++ से Objective-C कितना अलग है? [बन्द है]


171

वाक्यविन्यास, विशेषताओं, प्रतिमानों, रूपरेखा और पुस्तकालयों के संदर्भ में उद्देश्य-सी और सी ++ के बीच मुख्य अंतर क्या हैं?

* महत्वपूर्ण: मेरा लक्ष्य दो भाषाओं के बीच एक प्रदर्शन युद्ध शुरू करना नहीं है। मुझे केवल वास्तविक कठिन तथ्य चाहिए। वास्तव में, मेरा प्रश्न प्रदर्शन से संबंधित नहीं है! किसी भी चीज़ के लिए कृपया स्रोत दें जो व्यक्तिपरक लग सकता है।


2
यह मार्गदर्शिका मेरे द्वारा देखी गई सबसे अच्छी तुलना देती है।
LiraNuna

@ ऑस्कर केजेलिन: मैक और लीरनुना के उत्तर दोनों उत्कृष्ट उत्तर हैं। मैं जानबूझकर यह तय नहीं कर सकता कि कौन सा सबसे अच्छा है क्योंकि दोनों एक-दूसरे को जवाब देते हैं।
22

@ अच्छी तरह से मुझे पता है (उस में ठोकर खाते हुए अक्सर खुद को)। शायद बस शीर्ष एक को चिह्नित करें जैसा कि उत्तर दिया गया है कि मैं क्या कर सकता हूं जब वह तय नहीं कर सकता। मुझे पसंद नहीं है जब प्रश्न हैं, जब वे जवाब दिए गए हैं जैसे कि चिह्नित नहीं हैं :(
ऑस्कर केजेलिन

1
पहले और इसके विपरीत में दूसरे उत्तर के लिए एक लिंक रखो
ली टेलर

जवाबों:


185

कुछ प्रमुख अंतरों की संक्षिप्त सूची:

  • C ++ कई उत्तराधिकार की अनुमति देता है, Objective-C नहीं।
  • C ++ के विपरीत, Objective-C विधि मापदंडों को नामित करने की अनुमति देता है और विधि हस्ताक्षर में केवल नाम और प्रकार के पैरामीटर और रिटर्न प्रकार शामिल हैं (देखें बबूम और चक की टिप्पणियाँ नीचे)। इसकी तुलना में, C ++ सदस्य फ़ंक्शन हस्ताक्षर में फ़ंक्शन नाम के साथ-साथ केवल पैरामीटर / रिटर्न (उनके नाम के बिना) के प्रकार शामिल हैं।
  • C ++ उपयोग करता है bool, trueऔर false, Objective-C उपयोग करता है BOOL, YESऔर NO
  • C ++ उपयोग करता है void*और nullptr, Objective-C पसंद करता है idऔर nil
  • ऑब्जेक्टिव-सी "सिलेक्टर्स" (जिसमें टाइप होता है SEL) फंक्शन पॉइंटर्स के बराबर होता है।
  • ऑब्जेक्टिव-सी एक मैसेजिंग प्रतिमान (एक ला स्मॉलटाक) का उपयोग करता है जहां आप विधियों / चयनकर्ताओं के माध्यम से वस्तुओं को "संदेश" भेज सकते हैं।
  • उद्देश्य-सी खुशी से आपको nilC ++ के विपरीत एक संदेश भेजने देगा , जो यदि आप के सदस्य फ़ंक्शन को कॉल करने का प्रयास करते हैं तो क्रैश हो जाएगाnullptr
  • ऑब्जेक्टिव-सी डायनेमिक डिस्पैच की अनुमति देता है, जिससे क्लास को रनटाइम पर एक मैसेज का जवाब देने की अनुमति मिलती है, सी ++ के विपरीत जहां ऑब्जेक्ट को एक विधि पर संकलित किया जाता है वह संकलन समय पर जाना चाहिए (नीचे विल्हेमटेल की टिप्पणी देखें)। यह पिछले बिंदु से संबंधित है।
  • उद्देश्य-सी "गुणों" का उपयोग करके सदस्य चर के लिए एक्सेसरों के ऑटोजेनरेशन की अनुमति देता है।
  • ऑब्जेक्टिव-सी self, असाइन करने की अनुमति देता है , और क्लास इनिशियलाइज़र्स (कंस्ट्रक्टर्स के समान) को अगर वांछित है तो पूरी तरह से अलग क्लास वापस करने की अनुमति देता है। C ++ के विपरीत, यदि आप एक वर्ग का एक नया उदाहरण बनाते हैं (या तो स्टैक पर निहित है, या स्पष्ट रूप से new) तो यह मूल रूप से आपके द्वारा निर्दिष्ट प्रकार के होने की गारंटी है।
  • इसी प्रकार, ऑब्जेक्टिव-सी में अन्य कक्षाएं गतिशील तरीके से इंटरसेप्ट मेथड कॉल को लक्ष्य समय में बदल सकती हैं।
  • ऑब्जेक्टिव-सी में सी ++ के नाम स्थान की सुविधा का अभाव है।
  • ऑब्जेक्टिव-सी में C ++ संदर्भ के बराबर की कमी है।
  • उद्देश्य-सी में कंटेनरों में कमजोर टाइपिंग की अनुमति देने के लिए, उदाहरण के लिए (उदाहरण के लिए) प्राथमिकता वाले टेम्पलेट्स का अभाव है।
  • ऑब्जेक्टिव-सी इंप्लांट विधि को ओवरलोडिंग की अनुमति नहीं देता है, लेकिन सी ++ करता है। यही है, सी ++ में int foo (void)और int foo (int)विधि के एक निहित अधिभार को परिभाषित करता है foo, लेकिन उद्देश्य-सी में समान प्राप्त करने के लिए स्पष्ट अधिभार - (int) fooऔर की आवश्यकता होती है - (int) foo:(int) intParam। यह ऑब्जेक्टिव-सी के नामित मापदंडों के कारण कार्यात्मक रूप से C ++ के नाम मैनलिंग के बराबर है।
  • उद्देश्य-सी खुशी से सी ++ के विपरीत एक विधि और चर को समान रूप से साझा करने की अनुमति देगा, जिसमें आमतौर पर फिट होंगे। मुझे लगता है कि यह फ़ंक्शन पॉइंटर्स के बजाय चयनकर्ताओं का उपयोग करते हुए ऑब्जेक्टिव-सी के साथ कुछ करना है, और इस तरह विधि नाम वास्तव में "मान" नहीं है।
  • ऑब्जेक्टिव-सी वस्तुओं को स्टैक पर बनाने की अनुमति नहीं देता है - सभी ऑब्जेक्ट्स को ढेर से आवंटित किया जाना चाहिए (या तो स्पष्ट रूप से allocसंदेश के साथ , या एक उपयुक्त फैक्टरी विधि में स्पष्ट रूप से)।
  • C ++ की तरह, Objective-C में दोनों स्ट्रक्चर और क्लास होते हैं। हालाँकि, जहां C ++ में उन्हें लगभग बिल्कुल एक जैसा माना जाता है, Objective-C में उन्हें बेतहाशा अलग तरह से व्यवहार किया जाता है - उदाहरण के लिए, आप स्टैक पर स्ट्रक्चर बना सकते हैं।

मेरी राय में, शायद सबसे बड़ा अंतर वाक्य रचना है। आप दोनों भाषाओं में अनिवार्य रूप से समान चीजें प्राप्त कर सकते हैं, लेकिन मेरी राय में C ++ सिंटैक्स सरल है, जबकि ऑब्जेक्टिव-सी की कुछ विशेषताएं कुछ कार्य (जैसे GUI डिजाइन) को गतिशील प्रेषण के लिए आसान धन्यवाद देती हैं।

संभवत: बहुत सारी अन्य चीजें भी जिन्हें मैंने याद किया है, मैं उन अन्य चीजों के साथ अपडेट करूंगा, जिनके बारे में मैं सोचता हूं। इसके अलावा, गाइड अत्यधिक की सिफारिश कर सकते हैं LiraNuna ने आपको बताया। संयोग से, ब्याज की एक और साइट यह हो सकती है ।

मुझे यह भी इंगित करना चाहिए कि मैं अभी-अभी ऑब्जेक्टिव-सी सीखना शुरू कर रहा हूं, और जैसा कि ऊपर का बहुत कुछ सही या पूर्ण नहीं हो सकता है - अगर यह मामला है, तो मैं माफी चाहता हूं और सुधार के लिए सुझावों का स्वागत करता हूं।

संपादित करें: निम्नलिखित टिप्पणियों में उठाए गए बिंदुओं को संबोधित करने के लिए अद्यतन किया गया, सूची में कुछ और आइटम जोड़े गए।


8
निर्णय की सूची; एक सुधार। वे "नामित पैरामीटर" नहीं हैं, लेकिन "इंटरलेय्ड पैरामीटर" हैं। नाम और "कीवर्ड तर्क" यह सोचकर भ्रम पैदा करते हैं कि विधि नाम के कुछ सबसेट को छोड़ा जा सकता है। यह नहीं कर सकते।
बीबम

7
आप सबसे महत्वपूर्ण अंतर को सूचीबद्ध करना भूल गए: ऑब्जेक्ट-सी डायनेमिक डिस्पैच का उपयोग करता है, जबकि सी ++ स्टेटिक डिस्पैच का उपयोग करता है। दूसरे शब्दों में, एक उद्देश्य-सी संकलक द्वारा संकलित कोड में रनटाइम पर निर्धारित संदेश का जवाब देने के लिए जिम्मेदार वर्ग होगा; C ++ कंपाइलर द्वारा संकलित कोड में इस जानकारी की गणना की जाती है और संकलित में संकलित की जाती है।
विल्हेमटेल

9
@wilhelmtell: C ++ कंपाइलर केवल संकलन समय पर सुपरक्लास को जानता है। वास्तविक समय में वास्तविक वर्ग कोई भी वंशज हो सकता है। यह भी डायनेमिक प्रेषण का एक रूप है, लेकिन जैसा कि उद्देश्य सी में उपयोग किया जाता है, वैसा ही रूप नहीं है। बस उन तकनीकी शब्दों से सावधान रहें!
नॉर्मन राम्से

5
+1 अच्छी सूची। हालांकि, ऑब्जेक्टिव-सी भी उपयोग करता है void*और NULL, बस वस्तुओं के लिए नहीं। आप ओबज-सी में किसी भी सी-स्टाइल पॉइंटर का उपयोग कर सकते हैं, और कई एपीआई कॉल वास्तव में संदर्भ द्वारा मानों को पारित या वापस करते हैं, जिस स्थिति NULLमें अक्सर उपयोग किया जाता है।
क्विन टेलर

3
@wilhelmtell - मुझे उद्देश्य-सी के बारे में कुछ भी पता नहीं है, लेकिन C ++ में आप गतिशील रूप से एक फ़ंक्शन कॉल के लिए एक अलग वर्ग का जवाब दे सकते हैं, लेकिन आपको आधार वर्ग के पॉइंटर्स की एक सरणी की तरह कुछ चाहिए, और फिर ACTUAL कक्षाएं। यह "बंद" हैं। जबकि सभी वर्गों को उप-वर्ग होने की आवश्यकता होती है, रन-टाइम पर, क्लास के आधार पर एक विधि कॉल विल अलग-अलग तरीकों से कॉल करेगी।
केविन एंडरसन

33

जबकि वे दोनों सी में निहित हैं, वे दो पूरी तरह से अलग भाषाएं हैं।

एक बड़ा अंतर यह है कि ऑब्जेक्टिव-सी प्रेषण के लिए रनटाइम-फैसलों पर केंद्रित है और विरासत और बहुरूपता को संभालने के लिए इसके रनटाइम लाइब्रेरी पर निर्भर करता है, जबकि C ++ में फोकस आमतौर पर स्टैटिक, कंपाइल टाइम, फैसलों पर होता है।

पुस्तकालयों के बारे में, आप दोनों भाषाओं में सादे सी पुस्तकालयों का उपयोग कर सकते हैं - लेकिन उनकी मूल पुस्तकालय पूरी तरह से अलग हैं।

हालांकि रुचि यह है कि आप दोनों भाषाओं (कुछ सीमाओं के साथ) को मिला सकते हैं। परिणाम को Objective-C ++ कहा जाता है


अद्यतन लिंक: उद्देश्य-सी ++
IcyIcicle

6

वे पूरी तरह से अलग हैं। ऑब्जेक्टिव C में C ++ की तुलना में स्मालटाक के साथ सामान्य रूप से अधिक है (ठीक है, सिंटैक्स को छोड़कर, वास्तव में)।


6

मेरे सर के ऊपर से चला गया:

  1. शैलियाँ - Obj-C गतिशील है, C ++ आमतौर पर स्थिर है
  2. हालांकि वे दोनों ओओपी हैं, मुझे यकीन है कि समाधान अलग होंगे।
  3. विभिन्न ऑब्जेक्ट मॉडल (C ++ इसके संकलन-समय प्रकार प्रणाली द्वारा प्रतिबंधित है)।

मेरे लिए, सबसे बड़ा अंतर मॉडल सिस्टम है। ओब्ज-सी आपको मैसेजिंग और आत्मनिरीक्षण करने की सुविधा देता है, लेकिन C ++ में कभी-बहुत शक्तिशाली टेम्पलेट हैं।

प्रत्येक की अपनी ताकत है।


5

जैसा कि दूसरों ने कहा है, ऑब्जेक्ट-सी के संदर्भ में ऑब्जेक्टिव-सी बहुत अधिक गतिशील है, यह सी + + की काफी स्थिर दायरे की वस्तुओं के बारे में सोचता है।

ऑब्जेक्टिव-सी, ऑब्जेक्ट-ओरिएंटेड लैंग्वेज के स्मॉलटॉक वंश में होने के कारण, उन ऑब्जेक्ट्स की अवधारणा है जो जावा, पायथन और अन्य "मानक", गैर-सी ++ ऑब्जेक्ट-ओरिएंटेड भाषाओं के समान है। बहुत सारे डायनामिक डिस्पैच, कोई भी ऑपरेटर ओवरलोडिंग नहीं करता, चारों ओर संदेश भेजता है।

C ++ अपना खुद का अजीब जानवर है; यह ज्यादातर परिवार के पेड़ के छोटे हिस्से को छोड़ देता है। कुछ मायनों में, इसमें विरासत के समर्थन के साथ एक अच्छा मॉड्यूल सिस्टम होता है जो ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के लिए उपयोग किया जा सकता है। चीजें बहुत अधिक स्थिर हैं (ओवरराइड करने योग्य तरीके डिफ़ॉल्ट नहीं हैं, उदाहरण के लिए)।


4

ऑब्जेक्टिव-सी, सी। का एक अधिक सही सुपरसेट है और void*एक स्ट्रक्चर पॉइंटर से ऑब्जेक्टिव-सी इंपैक्ट कास्टिंग की अनुमति है।

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

C ++ संकलित नहीं करेगा जब तक कि voidसूचक स्पष्ट रूप से डाली न जाए:

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

हर दिन की प्रोग्रामिंग की प्रासंगिकता शून्य है, बस एक मजेदार सामान्य ज्ञान तथ्य है।


दूसरा उदाहरण C ++ कोड नहीं है। यह C कोड है जो आपको C ++ कंपाइलर के साथ संकलित करने का प्रयास करते समय आपको एक त्रुटि देता है। यदि आप पुराने C ++ को मूल के करीब चाहते हैं, तो आप लिखेंगे Foo* bar = reinterpret_cast< Foo* >(malloc(sizeof(Foo));कि शायद inplace constructor का उपयोग करें .. लेकिन आज के रूप में इसका आधुनिक C ++ अधिक है जैसे auto bar = new Foo(constructorArg);आपको वास्तव में Malloc की आवश्यकता नहीं है, और या तो callic, आप उपयोग कर सकते हैं std::vector::reserve, औरstd::vector::emplace_mack
xakepp35

3

ओब्ज-सी की भाषा में स्वयं अधिक गतिशील क्षमताएं हैं, जबकि सी ++ कुछ गतिशील क्षमताओं के साथ संकलन-समय क्षमताओं पर अधिक केंद्रित है।

में, C ++ पैरामीट्रिक बहुरूपता को संकलन-समय पर जांचा जाता है, जबकि Obj-C में, पैरामीट्रिक बहुरूपता को गतिशील प्रेषण के माध्यम से प्राप्त किया जाता है और संकलन-समय पर जांच नहीं की जाती है।

ओबज-सी प्रकृति में बहुत गतिशील है। आप रन-टाइम के दौरान एक वर्ग के तरीकों को जोड़ सकते हैं। इसके अलावा, इसमें कक्षाओं को देखने के लिए रन-टाइम पर आत्मनिरीक्षण है। C ++ में, क्लास की परिभाषा नहीं बदल सकती है, और सभी आत्मनिरीक्षण को संकलन-समय पर किया जाना चाहिए। हालाँकि, कार्यों के मानचित्र (या ऐसा कुछ) के उपयोग से ओजे-सी की गतिशील प्रकृति सी ++ में प्राप्त की जा सकती है, यह ओब्ज-सी की तुलना में अभी भी अधिक क्रिया है।

C ++ में, संकलन समय पर किया जा सकता है। उदाहरण के लिए, एक प्रकार (एक संघ की तरह) का उपयोग करके संकलक यह लागू कर सकता है कि सभी मामले लिखे या संभाले गए हैं। तो आप एक समस्या के किनारे मामलों को संभालने के बारे में मत भूलना। हालांकि, ये सभी चेक संकलन करते समय एक कीमत पर आते हैं। ओजे-सी, सी ++ की तुलना में बहुत तेज है।


3
यदि आप कीमतों के बारे में बात करने जा रहे हैं, तो उचित रहें! इसके विपरीत, Obj-C गतिशील विधि कॉल को C ++ की तुलना में रनटाइम पर हल करने में बहुत धीमा है। और मैं तर्क दूंगा कि रनटाइम गति की तुलना में संकलन गति एक सापेक्ष तुच्छता है। मुझे यकीन है कि ओबज-सी अपने अधिक गतिशील प्रेषण के कारण कई लाभ प्रदान करता है, लेकिन वहां एक व्यापार बंद है।
अंडरस्कोर_ड

1
सच है, रनटाइम बनाम संकलन समय लागत के बीच एक व्यापार है। हालांकि, संकलन समय हमेशा तुच्छ नहीं होता है। C ++ (जैसे Boost.Spirit) में भारी मेटाप्रोग्रामिंग और EDSLs पुस्तकालयों का उपयोग करते हुए, संकलन समय पर एक कठोर प्रभाव हो सकता है, जबकि रनटाइम में बहुत तेज कोड का उत्पादन होता है।
पॉल फुल्ट्ज II

1
निश्चित रूप से, मैं सरल कोडबस के पीओवी के सापेक्ष ओवरसिम्प्लीफाइंग कर रहा था ... बहुत जटिल कोडबेस के साथ, छोटे परिवर्तनों का परीक्षण करने के लिए पुन: जमा करने से विकास बहुत थकाऊ हो सकता है, जो कि एक तुच्छता नहीं है। लेकिन क्या यह ऐसी चीज है जिसकी हम वास्तव में दोनों के बीच तुलना कर सकते हैं? क्या इस तरह के पुस्तकालय, सी + + संकलन-समय की विशेषताओं पर निर्भर होते हैं, किसी भी तरह उद्देश्य-सी में फिर से जुड़ सकते हैं और तेजी से संकलन करने के लिए दिखाए जाते हैं? "क्या कथन ओब्ज-सी, सी ++ की तुलना में अधिक तेज है" समकक्ष कोडबेस को संदर्भित करता है जिसके लिए एक प्रतिकृति गति को मापा जा सकता है? अन्यथा हम सेब बनाम संतरे को उगाने में लगने वाले समय की तुलना कर रहे हैं।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.