शुरू करने के लिए, हमेशा कुछ समस्याएं होंगी जो एक भाषा में दूसरे की तुलना में बेहतर हल होती हैं। हमेशा ऐसी भाषाएं होंगी जो किसी भी अन्य भाषा की तुलना में "बेहतर" की कुछ परिभाषा के लिए विशिष्ट समस्याओं को "बेहतर" हल करती हैं। हालांकि, बहुत बड़ी संख्या में समस्याओं की बहुत समान आवश्यकताएं होती हैं (कुछ I / O, कुछ संगणना) और समान आवश्यकताओं (उचित विश्वसनीयता, उचित प्रदर्शन) का सामना करना पड़ता है।
जैसा कि आप सी को पहले से ही जानते हैं, वहां की अधिकांश समस्याओं के लिए, मैं बताता हूं कि सी ++ कोई महत्वपूर्ण गिरावट और कई महत्वपूर्ण सुधार प्रदान नहीं करता है। साहसिक? कुछ लोगों को ऐसा लगता है, लेकिन यह वास्तव में मामला है। आइए कुछ बहुत ही सामान्य सी ++ गलतफहमी को दूर करके शुरू करें:
C ++ गलत है। C गलत है! कई C प्रोग्राम मान्य C ++ प्रोग्राम भी हैं - और ऐसे C प्रोग्राम को समान गति से चलना चाहिए जब C कंपाइलर या C ++ कंपाइलर के साथ संकलित किया जाए।
C ++ की विशिष्ट विशेषताओं में ओवरहेड की आवश्यकता होती है। गलत! कुछ खास ++ फीचर्स (जैसे वर्चुअल फंक्शन कॉल्स या अपवाद) द्वारा शुरू किया गया तथाकथित ओवरहेड, ओवरहेड के साथ तुलनीय है, जिसे आप खुद बताएंगे कि आपको सी में एक समान फीचर लागू करना चाहिए।
C ++ ऑब्जेक्ट ओरिएंटेड है। गलत! C ++ भाषा में कुछ भाषा एक्सटेंशन हैं जो ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग और जेनेरिक प्रोग्रामिंग की सुविधा प्रदान करते हैं। C ++ ऑब्जेक्ट ओरिएंटेड डिज़ाइन को कहीं भी बाध्य नहीं करता है - यह केवल इसे अनुमति देता है। C ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के लिए भी अनुमति देता है, C ++ इसे सरल और कम त्रुटि वाला बनाता है।
इसलिए, यदि आप मुझ पर विश्वास करते हैं, तो हमने स्थापित किया है कि "C ++, C से बहुत अधिक खराब नहीं है"। आइए नजर डालते हैं कि C ++ को बेहतर C कौन बनाता है:
मजबूत टाइपिंग C ++ में टाइप सिस्टम से अधिक मजबूत है। यह कई सामान्य प्रोग्रामिंग त्रुटियों को रोकता है - अगले बहुत महत्वपूर्ण विशेषता के साथ मिलकर, मजबूत प्रकार की प्रणाली भी असुविधा का कारण नहीं बनती है।
पैरामीटर प्रकार टेम्प्लेट कीवर्ड प्रोग्रामर को एल्गोरिदम के जेनेरिक (प्रकार-अज्ञेयवादी) कार्यान्वयन को लिखने की अनुमति देता है। जहाँ C में, कोई एक जेनेरिक सूची कार्यान्वयन को एक तत्व के साथ लिख सकता है जैसे:
struct element_t {
struct element_t *next, *prev;
void *element;
};
C ++ किसी को कुछ लिखने की अनुमति देता है:
template <typename T>
struct element_t {
element_t<T> *next, *prev;
T element;
};
न केवल सी ++ कार्यान्वयन आम प्रोग्रामर त्रुटियों को रोकता है (जैसे सूची पर गलत प्रकार का एक तत्व डालना), यह संकलक द्वारा बेहतर अनुकूलन की अनुमति भी देता है! उदाहरण के लिए, एक सामान्य प्रकार का कार्यान्वयन C और C ++ दोनों में उपलब्ध है -
सी दिनचर्या के रूप में परिभाषित किया गया है:
void qsort(void *base, size_t nmemb, size_t size,
int(*compar)(const void *, const void *));
जबकि C ++ दिनचर्या के रूप में परिभाषित किया गया है
template void sort(RandomAccessIterator first, RandomAccessIterator last);
अंतर यह है कि उदाहरण के लिए, पूर्णांक की एक सरणी को छांटने के लिए, सी मामले में, हर एक तुलना के लिए एक फ़ंक्शन कॉल की आवश्यकता होगी, जबकि C ++ कार्यान्वयन कंपाइलर को पूर्णांक तुलना कॉल को वास्तविक इनलाइन रूटीन के रूप में इनलाइन करने की अनुमति देगा। संकलक द्वारा संकलित समय पर स्वचालित रूप से त्वरित रूप से, टेम्प्लेट तर्कों में सम्मिलित सही प्रकारों के साथ।
- एक बड़ा मानक पुस्तकालय C ++, C मानक पुस्तकालय के पूर्ण उपयोग की अनुमति देता है। यह निश्चित रूप से बहुत महत्वपूर्ण है, क्योंकि वास्तविक विश्व कार्यक्रम लिखते समय सी मानक पुस्तकालय एक अमूल्य संसाधन है। हालाँकि, C ++ में मानक टेम्पलेट लाइब्रेरी शामिल है। एसटीएल में कई तरह के उपयोगी टेम्पलेट शामिल हैं, जैसे कि ऊपर की दिनचर्या। इसमें उपयोगी सामान्य डेटा संरचनाएं जैसे सूचियां, नक्शे, सेट, आदि शामिल हैं। क्रमबद्ध दिनचर्या की तरह, अन्य एसटीएल दिनचर्या और डेटा संरचनाएं प्रोग्रामर की विशिष्ट आवश्यकताओं के लिए "अनुरूप" हैं - सभी प्रोग्रामर को इसे भरना है। प्रकार के।
बेशक, एसटीएल कोई चांदी की गोली नहीं है - लेकिन यह सामान्य समस्याओं को हल करते समय बहुत बार बहुत मदद करता है। आपने कितनी बार C में एक सूची लागू की है? आरबी-ट्री कितनी बार एक बेहतर समाधान होता, अगर केवल आपके पास इसे करने का समय होता? एसटीएल के साथ आपको इस तरह के समझौते करने की आवश्यकता नहीं है - पेड़ का उपयोग करें यदि यह बेहतर फिट है, तो सूची का उपयोग करना उतना आसान है।
ठीक है, इसलिए मैं केवल अच्छे हिस्सों पर चर्चा कर रहा हूं। क्या कोई डाउनसाइड है? जरूर हैं। हालांकि, उनकी संख्या दिन-प्रतिदिन सिकुड़ती जा रही है। मुझे समझाने दो:
कोई अच्छा C ++ कंपाइलर नहीं हैं यह लंबे समय से ऐसा है। लेकिन आपको याद होगा, कि 1998 में भाषा को मानकीकृत किया गया था - यह एक जटिल भाषा है, सी से अधिक जटिल है। इसे संकलक को मानक तक पकड़ने में लंबा समय लगा है। लेकिन इस लेखन के रूप में, वहाँ बाहर सबसे व्यापक रूप से उपयोग किए जाने वाले प्लेटफार्मों के लिए अच्छे संकलक उपलब्ध हैं; संस्करणों में GCC 3.X आम तौर पर बहुत अच्छे होते हैं, और यह GNU / Linux और अधिकांश UNIX प्लेटफार्मों पर चलता है। Win32 के लिए इंटेल का एक अच्छा संकलक है - यह भी बहुत अच्छा है, लेकिन दुर्भाग्य से यह अभी भी एमएस एसटीएल पर निर्भर करता है जो कि सब-बराबर है।
लोग अच्छे C ++ को नहीं जानते। यह अक्सर सुनी जाने वाली शिकायत नहीं है, लेकिन यह कुछ ऐसा है जिसे मैं बहुत देखता हूं। C ++ एक बड़ी और जटिल भाषा है - लेकिन यह एक ऐसी भाषा भी हुआ करती थी जो बहुत अधिक सम्मोहित करती थी, विशेष रूप से "OOP भूख को शांत करती है, एड्स और कैंसर को ठीक करती है"। इसका परिणाम यह प्रतीत होता है कि वास्तव में बहुत सी सी ++ कोड, मूल रूप से खराब सी कुछ वर्ग की घोषणाओं के साथ यहां और वहां, बाहर है और सीखने की सामग्री के रूप में उपयोग किया जा रहा है। इसका मतलब है कि बहुत से लोग मानते हैं कि वे जानते हैं कि सी ++ वास्तव में वास्तव में भद्दा कोड लिखता है। यह बहुत बुरा है, और यह एक समस्या है, लेकिन मुझे लगता है कि C ++ पर यह आरोप लगाना अनुचित है।
तो, C ++ के साथ केवल दो प्रमुख समस्याएं C ++ के परिणाम हैं एक युवा भाषा। समय में वे गायब हो जाएंगे। और वहां की अधिकांश समस्याओं के लिए, यदि आप अच्छे प्रोग्रामर प्राप्त कर सकते हैं (या स्वयं अच्छा C ++ सीख सकते हैं), तो समस्याएं वास्तव में आज का मुद्दा नहीं हैं।