C ++ की बातें जो C प्रोग्रामर को परेशान करती हैं
हुड के नीचे बहुत सारा जादू हो रहा है; कंस्ट्रक्टर, डिस्ट्रक्टर्स, वर्चुअल मेथड्स, टेम्प्लेट आदि, C ++ कोड को C कोड के मुकाबले लिखने में बहुत आसान और तेज़ बना सकते हैं, लेकिन समझने में कठिन और कारण के माध्यम से समझ सकते हैं (आप कितनी अच्छी तरह से C ++ और उससे जुड़े सम्मेलनों को जानते हैं)। कुछ के रूप में सरल के रूप में कोड का Foo newFoo;
एक बहुत आह्वान कर सकते हैं , इस पर निर्भर करता है कि वर्ग के लिए निर्माता Foo
(और किसी भी वर्ग पर निर्भर करता है) को कैसे परिभाषित किया गया है। यह इसलिए भी है कि सम्मेलन को कंटेनर के माध्यम से पुनरावृत्ति ++it
करने के बजाय लिखना है it++
, क्योंकि पोस्टफ़िक्स में ++
अक्सर एक महंगी कॉपी ऑपरेशन शामिल होता है।
आप जो कर रहे हैं, उसके आधार पर , विशेष रूप से सरल कार्यों के लिए कुछ गैर-तुच्छ ओवरहेड हो सकते हैं। निम्नलिखित दो प्रोग्राम लें, C में पहला, C ++ में दूसरा:
/* C version */
#include <stdio.h>
int main(void)
{
char greeting[] = "Hello, world";
printf("%s\n", greeting);
return 0;
}
/* end C version */
/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
std::string greeting("Hello, world");
std::cout << greeting << std::endl;
return 0;
}
/* end C++ version */
पहचान का व्यवहार, स्रोत के संदर्भ में बहुत अधिक अंतर नहीं है, लेकिन SLES 10 बॉक्स पर मैं gcc 4.1.2 के साथ काम करता हूं, पूर्व आकार में ~ 9kb का निष्पादन योग्य बनाता है, जबकि दूसरा 12.5kb (कोई अनुकूलन नहीं) लेता है ), लगभग 28% बड़ा। string
C स्ट्रिंग प्रकार की तुलना में C ++ टाइप IMO के साथ काम करने के लिए बहुत आसान है, और C ++ स्ट्रीम C स्ट्रीम की तुलना में बहुत अधिक लचीले और अनुकूलन योग्य हैं, लेकिन वास्तव में इस तरह के ब्रेन-डेड कोड के लिए, वे ओवरहेड के लायक नहीं हो सकते हैं।
C ++ , C की तुलना में एक बहुत बड़ी भाषा है, जिसमें कुछ बेहद जटिल शब्दार्थ हैं। C ++ की तुलना में C ++ में पारंगत होने में बहुत अधिक समय लगता है, जिसका अर्थ है कि बहुत से लोग जो C ++ को जानने का दावा करते हैं, वे यह नहीं जानते कि वे ऐसा करते हैं।
C के बारे में चीजें जो C ++ प्रोग्रामर को परेशान करती हैं
सी कल्पना के किसी भी खंड द्वारा एक सुरक्षित प्रोग्रामिंग भाषा नहीं है; सरणियों पर कोई सीमा नहीं जाँच करने से बहुत अधिक व्यवहार होता है (जैसा कि यह अब-मृत gets
फ़ंक्शन के माध्यम से scanf
होता है, %s
और %[
रूपांतरण रूपांतरण के माध्यम से होता है )। C ++ कम से कम आपको ऐसे कंटेनर देता है जो अपवादों को फेंकते हैं यदि आप उनकी वर्तमान में परिभाषित सीमा के बाहर तक पहुँचने का प्रयास करते हैं; सभी सी आपको देता है (यदि आप भाग्यशाली हैं) एक विभाजन उल्लंघन।
C ++ में मेमोरी प्रबंधन बहुत ही श्रम-गहन और त्रुटि प्रवण है, टूल C ++ आपको प्रदान करता है। यदि आप अपना कंटेनर बना रहे हैं, तो आप सभी कॉल malloc
और free
कॉल के मिलान के लिए ज़िम्मेदार हैं, सुनिश्चित करें कि आवंटन सफल हैं, त्रुटि की स्थिति में किसी भी आंशिक आवंटन का समर्थन करते हुए, C ++ में, आप केवल आइटम जोड़ते हैं या कंटेनर से आइटम निकालें। यदि कोई समस्या है, तो एक अपवाद फेंक दिया जाएगा।
इसी तरह, सी में त्रुटि से निपटने के उपकरण की तुलना में गधे में एक दर्द है सी + + प्रदान करता है (अर्थात्, अपवाद)। क्या सच में मज़ा है जब आपने स्मृति का एक गुच्छा आवंटित किया है और फिर अपने प्रसंस्करण में एक दीवार मारा; जैसा कि आपको वापस जाना है, आपको उस मेमोरी को सही क्रम में जारी करना होगा। C ++ और RAII सिद्धांतों के साथ, यह (अपेक्षाकृत) करना आसान है।
तो मैं कब एक का उपयोग करता हूं?
यदि आप जो लिख रहे हैं वह एक सरल है, तो इसे पढ़ें / इसे से टकराएं / इससे छुटकारा पाएं, जिसका व्यवहार इनपुट और आउटपुट के संदर्भ में साफ-साफ वर्णित किया जा सकता है, और प्रदर्शन मामले, तो C ++ पर C को प्राथमिकता दें। अन्यथा, C ++ को प्राथमिकता दें