C और C ++ के बीच मूलभूत अंतर क्या हैं? [बन्द है]


41

कई लोग "सी / सी ++" लिखते हैं, जैसे कि वे एक ही बात थे। हालांकि वे कई समानताएं साझा करते हैं, लेकिन वे स्पष्ट रूप से समान नहीं हैं।

लेकिन वास्तव में C और C ++ के बीच मूलभूत अंतर क्या हैं? क्या C ++ C का एक उन्नत संस्करण है, या C में ऐसी विशेषताएँ हैं जो C ++ में मौजूद नहीं हैं?


2
मैंने सोचा था कि C ++
उपयोगकर्ता

1
C ++ को बढ़ाया नहीं गया है ... इसका C का सुपरसेट है
जो डीएफ

2
@JoeDF यह बहुत शुरुआत में था, लेकिन यह वास्तव में "सी के साथ संगत" है जिसका मतलब अब एक ही बात नहीं है। आप C C में C ++ में कोड नहीं करते हैं और सभी मानक C ++ के अनुरूप नहीं हैं।
लिखिए

+1 आप सही हैं, अब भाई या चचेरे भाई हैं। क्या आपको पता है मेरा क्या मतलब है।
जो डीएफ

जवाबों:


43

निम्नलिखित बिंदु C ++ से संबंधित हैं:

  1. (उपयोगकर्ता द्वारा परिभाषित) स्टेटिक टाइप सिस्टम: आपके डेटा और उनके उपयोग के बारे में स्टेटिक चेक की अनुमति देता है - सी में बहुत आसानी से की गई त्रुटियों को इंगित करता है।
  2. बहु- "प्रतिमान": सी की तरह काम करने की अनुमति देता है, वस्तु-उन्मुख प्रतिमानों के साथ, सामान्य प्रतिमान आदि के साथ।
  3. कंस्ट्रक्टर / डिस्ट्रॉक्टर: एक बार कहने का एकमात्र तरीका क्या है जब कुछ बनाने या नष्ट करने और यह सुनिश्चित करने के लिए कि उपयोगकर्ता को सही फ़ंक्शन नहीं ढूंढना होगा और सी की तरह इसका उपयोग करना होगा।
  4. RAII (बुरी तरह से नामित): आपको हमेशा स्मृति का प्रबंधन करने की आवश्यकता नहीं है। बस चीजों को दायरे में रखें और अपनी वस्तुओं का जीवन भर वर्णन करने वाले स्मार्ट पॉइंटर्स का उपयोग करें। फिर भी कच्चे पॉइंटर्स का उपयोग कर सकते हैं।
  5. टेम्पलेट: मैक्रो से बेहतर, अंतिम संकलन से पहले हेरफेर करने और प्रकार उत्पन्न करने के लिए एक वास्तविक भाषा। केवल एक प्रकार की प्रणाली का अभाव है (भविष्य के C ++ मानकों में अवधारणाएं देखें)।
  6. ऑपरेटर अधिभार: एक सरल वाक्यात्मक तरीके से और यहां तक ​​कि अपने सी ++ कोड के अंदर एम्बेडेड डोमेन-विशिष्ट भाषाओं को परिभाषित करने के लिए संचालन का वर्णन करने की अनुमति देता है।
  7. स्कोप किए गए नाम: नामस्थान, वर्ग / संरचना, कार्य इत्यादि सरल नियम हैं, ताकि यह सुनिश्चित हो सके कि नाम क्लैश न हों।
  8. अपवाद प्रणाली: त्रुटियों को फैलाने का एक तरीका जो अक्सर रिटर्न कोड से बेहतर होता है। वास्तव में, डोमेन-विशिष्ट तार्किक त्रुटियों के लिए रिटर्न कोड अच्छा है, क्योंकि एप्लिकेशन को इसे प्रबंधित करना है। अपवाद का उपयोग "कठिन" त्रुटियों के लिए किया जाता है, जो निम्न कोड को गलत बनाते हैं। यदि संभव हो तो कॉल स्टैक में त्रुटियों को पकड़ने की अनुमति देता है, इस तरह के अपवाद पर प्रतिक्रिया करें (लॉगिंग करके या राज्य को ठीक करके) और आरएआईआई के साथ, अगर अच्छी तरह से उपयोग किया जाता है, तो यह पूरे कार्यक्रम को गलत नहीं बनाता है - यदि अच्छी तरह से किया जाता है, फिर से।
  9. द स्टैंडर्ड लाइब्रेरी: सी का अपना एक है, लेकिन यह सब "गतिशील" है। C ++ मानक लाइब्रेरी लगभग टेम्प्लेट (कंटेनरों और एल्गोरिदम) से बना (IO स्ट्रीम नहीं) है जो केवल आपके द्वारा उपयोग किए जाने वाले कोड को उत्पन्न करने की अनुमति देता है। बेहतर: जैसा कि कंपाइलर को कोड जनरेट करना होता है, यह संदर्भ के बारे में बहुत कुछ जान लेगा और इसके कोड को बाधित करने के लिए कोडर की आवश्यकता के बिना बहुत सी अनुकूलन लागू करेगा - टेम्पलेट्स और अन्य चीजों के लिए धन्यवाद।
  10. const-correctness: यह सुनिश्चित करने का सबसे अच्छा तरीका है कि आप उन चर को न बदलें जो आपको नहीं करना चाहिए। वैरिएबल तक केवल पढ़ने के लिए पहुँच निर्दिष्ट करने की अनुमति देता है। और यह केवल संकलन समय पर जाँच की जाती है ताकि कोई रनटाइम लागत न हो।

31

C ++ को जटिलता का प्रबंधन करने के लिए आविष्कार किया गया था जिसे C हैंडल नहीं कर सका। उदाहरण के लिए, सी के साथ एक आम समस्या यह थी कि आप "चर के लिए नामों से बाहर चल सकते हैं" (निश्चित रूप से नहीं लिया जाना चाहिए) क्योंकि कोई एनकैप्सुलेशन, नामस्थान आदि नहीं था।

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

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

अंत में, OOP द्वारा टाल दिए गए कई अन्य फायदे हैं, जैसे ऑब्जेक्ट पुन: उपयोग के साथ-साथ जेनेरिक प्रोग्रामिंग आधारित अवधारणाएं, जैसे कि टेम्प्लेट और जेनेरिक जो आपको स्रोत कोड का पुन: उपयोग करने की अनुमति देते हैं, आदि।

और बहुत सारी अन्य चीजें जो यहां सूचीबद्ध करने में मेरा बहुत समय लेती हैं।


मुझे पसंद है कि आप C ++ कंस्ट्रक्टर बनाम C स्ट्रक्चर्स के बारे में लिखते हैं, और यह त्रुटि-प्रवण है। मैं इस से सहमत हूँ। लेकिन मुझे JavaBeans में इसका उपयोग करने का जावा तरीका पसंद नहीं है, जो हमेशा एक खाली कंस्ट्रक्टर का उपयोग करता है और फिर सेटर्स के साथ सदस्य फ़ील्ड सेट करता है। मेरे दृष्टिकोण में, सी स्ट्रक्चर्स की तरह त्रुटि-प्रवण है। मैं अपने जावा ऑब्जेक्ट्स को केवल कंस्ट्रक्टर के साथ सेट करना पसंद करूंगा। इस बारे में StackOverflow पर मेरा प्रश्न देखें ।
जोनास

आपके पास एक बिंदु है, लेकिन यहां मेरे जवाब का ध्यान C बनाम C ++ था।
०१:१५ पर जैस

1
ओह, चलो, जो आपको C के साथ OOP का उपयोग करने से रोकता है? आप वस्तुओं का पुन: उपयोग कर सकते हैं और कुछ भी कर सकते हैं, यहां तक ​​कि अपवाद भी। यहाँ तक कि इसके बारे में एक पुस्तक भी है, जिसका नाम OOP प्रोग्रामिंग है। सी

2
@Vlad, आप जो भी बात कर रहे हैं, उसमें से कोई भी 25 साल पहले एक विकल्प नहीं था।
जस

4
आप लगभग हर प्रोग्रामिंग लैंग्वेज में OOP कर सकते हैं, लेकिन इसका मतलब यह नहीं है कि इसके लिए भाषा डिज़ाइन की गई थी। उदाहरण के लिए लूआ को लें। हालांकि यह तकनीकी रूप से OOP की अनुमति देता है, ऐसा लगता है कि इसे करने के पचास अलग-अलग तरीके हैं, बहुत सिरदर्द का कारण।
19

15

सामान्य तौर पर, C में मौजूद हर चीज C ++ में समर्थित होती है। जाहिर है कि इसके विपरीत बिल्कुल झूठ है।

सीधे शब्दों में, C ++ ऑब्जेक्ट ओरिएंटेड है (इसलिए, उदाहरण के लिए, आपके पास कक्षाएं हैं), C नहीं है।

C ++ में बूलियन प्रकार C89 नहीं है।

वे अलग-अलग भाषाएं हैं। वे ज्यादातर सिंटैक्स को साझा करते हैं।


4
C99 में एक बूलियन प्रकार है (नाम _Bool, boolएक उपनाम के रूप में)।
जेरी कॉफिन

1
यह कड़ाई से सच नहीं है। उदाहरण के लिए, C99 में long longडेटा प्रकार है जो ISO C ++ का हिस्सा (अभी तक) नहीं है।
चिन्मय कांची

11
त्रुटि ... C ++ केवल ऑब्जेक्ट ओरिएंटेड नहीं है: आप C ++ के साथ ऑब्जेक्ट ओरिएंटेड प्रतिमानों का उपयोग कर सकते हैं क्योंकि भाषा इसके लिए सुविधाएँ प्रदान करती है, लेकिन यह अन्य प्रतिमानों के लिए भी सुविधाएँ प्रदान करती है। आपको यह उल्लेख करना चाहिए कि, यह वास्तव में महत्वपूर्ण है, यह सब कुछ बदल देता है। यदि ऐसा नहीं होता है, तो हम सभी को जावा पर स्विच करना होगा ...
नोवल

4
C में ऐसे कई कंस्ट्रक्शन हैं जो C ++ में काम नहीं करते हैं।

1
@klez: हाँ - लेकिन यह अभी भी गलत है। जबकि ANSI ने मूल रूप से C89 (जिसमें एक बूलियन प्रकार नहीं था) विकसित किया था, अब नया विकास ISO द्वारा किया गया है, और ANSI ISO मानक को स्वीकार करता है, इसलिए वर्तमान ANSI C मानक वर्तमान ISO C मानक (जो कि है) के समान है एक बूलियन प्रकार)।
जेरी कॉफ़िन

8

C99 में कुछ विशेषताएं हैं जो C ++ में मौजूद नहीं हैं (कम से कम ठीक उसी रूप में) (जैसे, लचीली सरणी सदस्य, चर लंबाई सरणियाँ, आदि)

C99 ने लाइब्रेरी में बहुत कुछ जोड़ा है जो C ++ 98/03 मानक में मौजूद नहीं है; हालांकि इसमें से अधिकांश को C ++ 11 में जोड़ा गया है।

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


1

व्यक्तिगत रूप से, मुझे लगता है कि टेम्पलेट सबसे महत्वपूर्ण विशेषता है जो C ++ C में जोड़ता है।


1
एर, विरासत के साथ कक्षाओं के बारे में कैसे? यह वास्तव में सी में कड़ी मेहनत है, जबकि बहुत सारे टेम्प्लेट प्रीप्रोसेसर मैक्रोज़ के साथ किए जा सकते हैं।
JBRWilkinson

4
प्रीप्रोसेसर मैक्रोज़ प्रकार-सुरक्षित नहीं हैं; यह शुद्ध शाब्दिक प्रतिस्थापन है, जो डिबगिंग को कठिन बनाता है। काम करने के लिए बुनियादी कक्षाएं और विरासत प्राप्त करने के लिए सी + में बहुत काम नहीं है + आप जो भी भाषा डिजाइनर आपके लिए चुनते हैं, उसके साथ अटकने के बजाय अपना खुद का मेटाबेस मॉडल बनाने के लिए मिलता है। उदाहरण के लिए देखें, इस पत्र: arxiv.org/abs/1003.2547
zvrba

2
मेरा वोट सबसे महत्वपूर्ण विशेषता C ++ के ऊपर C (यहां तक ​​कि निर्माणकर्ताओं की अपनी अद्भुत सफाई क्षमताओं के कारण) के लिए विनाशकारी होगा।
थॉमस एडिंग

@ ज़वरबा #define GENERATE_INTERFACE(T) T T##_func(T x);; (प्रकार) सी में सुरक्षित ओवरलोडिंग / टेम्पलेट्स। मैं थॉमस से सहमत हूं कि विध्वंसक एक अधिक महत्वपूर्ण विशेषता है सी गायब है। लेकिन विनाशकारी अक्सर महत्वपूर्ण कोड छिपाते हैं। नामपद (गुंजाइश) मेरी राय में सबसे महत्वपूर्ण हैं।
योयोयोनी 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.