क्या C ++ OOP के लिए उपयुक्त नहीं है? [बन्द है]


12

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

क्या इसमें कुछ सच्चाई है; यदि हां, तो क्यों?


क्या आप इसके लिए देख रहे हैं? stackoverflow.com/questions/1635583/… ? या यह javaworld.com/javaworld/jw-04-2001/jw-0406-java101.html ?
S.Lott

5
OOP एक अच्छी तरह से परिभाषित शब्द नहीं है, इसलिए C ++ है या नहीं, इस पर चर्चा करना व्यर्थ है।
ज़वरा

जवाबों:


31

जैसा कि वर्णन किया गया है कि * * एलन का क्या वास्तव में "वस्तु उन्मुख" शब्द से मतलब है? , एलन के ने सोचा कि संदेश-पास करना OOP का महत्वपूर्ण बिट था, लेकिन यह बिट है कि "सी विथ क्लासेस" (जो बाद में C ++ बन गया) का अभाव है। C ++ थोड़े से व्यवहार के साथ केवल संरचना है, जबकि स्मॉलटाकल या ऑब्जेक्टिव-सी में ऑब्जेक्ट "बुद्धिमान" हैं, जिसमें वे तय कर सकते हैं कि वे उन संदेशों के साथ क्या करते हैं जो वे भेजे गए हैं। यदि एक Smalltalk-esque ऑब्जेक्ट एक संदेश प्राप्त करता है, जिसके लिए कार्यान्वयन नहीं होता है, तो यह आलस्य को एक जोड़ सकता है, संदेश को किसी अन्य ऑब्जेक्ट में अग्रेषित कर सकता है, या कोई मनमानी कर सकता है।

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

यदि आप संदेश-पासिंग को OOP के लिए मौलिक मानते हैं , तो जब आप इसे C ++ के साथ कर सकते हैं , तो यह आसान से बहुत दूर है। OTOH यदि आप OOP को उस डेटा पर कार्य करने वाले कार्यों से संबद्ध करने के लिए लेते हैं, तो C ++ ठीक है।


8
+1 - लेकिन मैंने हमेशा सोचा कि एक फ़ंक्शन कॉल वैसे भी एक संदेश पारित करने का एक उचित तरीका था। सच है, यह सब कुछ के लिए एक उच्च स्तर के बजाय एक निम्न स्तर की नींव है - लेकिन सक्रिय ऑब्जेक्ट पैटर्न से पता चलता है कि यह उस नींव तक का निर्माण करने योग्य है।
स्टीव ३४

6
तो यह लागू होता है न केवल सेल्सियस तक ++, लेकिन जावा, सी #, वस्तु पास्कल, आदि के लिए किया जा रहा है और यह Windows API संदेश प्रणाली क्या एलन OOP में सबसे महत्वपूर्ण बात यह, के रूप में मतलब है कि समाप्त होता है विशेष रूप से जिस तरह से यह डेल्फी द्वारा नियंत्रित किया जाता
त्रिनिदाद

@ ट्रिनिडाड सही, सी # को छोड़कर वास्तव में गतिशील संकल्प का समर्थन करता है। मैं उम्मीद करता हूं कि यह कहना उचित होगा कि ओओपी के बारे में हमारा विचार समय के साथ बदल गया है ताकि संदेश-पारित होने की कमी के आसपास काम हो सके। विक्रेताओं को यह कहने में कोई संदेह नहीं है कि साक्ष्य के सामने उनकी तकनीक निश्चित रूप से OOP है ...

@ steve314 हाँ यह है। वास्तव में यह है कि ObjC कैसे काम करता है, एक संदेश भेजने को एक फ़ंक्शन कॉल में अनुवादित किया जाता है जो विधि फ़ंक्शन को देखता है और कॉल करता है। जैसा कि मैंने संदेश-पासिंग को समझा है, यह डबल प्रेषण है जो महत्वपूर्ण है।

1
@Paul: Win32 API के साथ कुछ सीमित अनुभव होने के बाद, मुझे समझ नहीं आया। कोई भी API जहाँ ऑब्जेक्ट्स वैरिएबल साइज़ के होते हैं, और जहाँ ऑब्जेक्ट को कितना बड़ा होना है, यह निर्धारित करने के लिए पहले एक रूटीन को कॉल करना आवश्यक है, मेमोरी को आवंटित करें, और इसे फिर से कॉल करें, सौंदर्य के लिए मेरा परीक्षण विफल हो जाता है।
डेविड थॉर्नले

27

इस तरह की चर्चा मुझे परेशान करती है क्योंकि ऐसा लगता है कि एक्साइजेसिस, लोग पवित्र शास्त्र या अमेरिकी संविधान के अर्थ पर बहस कर रहे हैं, और मूल लेखक (ओं) का क्या मतलब है, जैसे कि हमें लगता है कि कोई फर्क नहीं पड़ता।

देखिए, एलन के / एक चतुर व्यक्ति था, और उसके पास एक अच्छा विचार था, जो अन्य अच्छे विचारों के एक समूह के खिलाफ उबला हुआ था, और स्मॉलटॉक और अन्य भाषाओं में इसका अहसास पाया।

वह मसीहा नहीं है, और ओओपी एक सच्चा प्रोग्रामिंग प्रतिमान नहीं है।

यह कई लोगों के बीच एक अच्छा विचार है। क्या O ++ मानसिकता से आने वाले C ++ में अच्छे विचार हैं? बिलकुल यह करता है।


8

C ++ ओओपी का समर्थन करता है , यदि आप ओओपी को एनसेप्सुलेशन, इनहेरिटेंस और बहुरूपता से परिभाषित करते हैं।

हालाँकि, C ++ वास्तव में OOP पर उत्कृष्ट नहीं है । एक कारण यह है कि बहुरूपता अक्सर ढेर-आवंटित वस्तुओं पर निर्भर करती है, जो (स्मार्ट पॉइंटर्स के उपयोग के बावजूद), कचरा एकत्र भाषा के साथ काम करने के लिए अधिक स्वाभाविक हैं।

हालांकि C ++ एक्सेल, जेनेरिक-प्रोग्रामिंग में है। C ++ आपको आसानी से टेम्पलेट-आधारित कार्यात्मक प्रोग्रामिंग तकनीकों के माध्यम से अत्यधिक कुशल, सामान्य कोड बनाने की अनुमति देता है।


4

सिमुला से C ++ उधार ली गई OOP सुविधाएँ। एक या एक से अधिक सिमुला डेवलपर्स IIRC ने टिप्पणी की कि C ++ वह नहीं है जो उनके दिमाग में था।

C ++ में अमूर्तता के लिए अच्छे उपकरण हैं, लेकिन यह एक वस्तु-उन्मुख भाषा की तुलना में मिश्रित-प्रतिमान भाषा है। ऑब्जेक्ट ओरिएंटेड फीचर्स हैं, लेकिन आपके पास विकल्प हैं जो "सख्त OOP" नहीं हैं।

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

कुछ तरीकों से, C ++ एक शुरुआती प्रयोग होने के संकेत दिखाता है जो अभी भी यहां है। फिर भी, यह अभी भी एक अच्छा उपकरण है, जिसमें बहुत सारे फायदे हैं जो आपको अन्य ओओपी भाषाओं में नहीं मिलते हैं।


2
सी ++ गैर-ओओपी की अनुमति देता है और सी ++ ओओपी की अनुमति देता है, कुछ भाषा के लिए यह ओओपी होना चाहिए, इसलिए सी ++ एक ओओ भाषा है।
त्रिनिदाद

1
मेरा मानना ​​है कि स्मालटाक की प्रसिद्धि के एलन के ने कहा कि जब वह "ऑब्जेक्ट-ओरिएंटेड" शब्द गढ़ा तो सी ++ वह नहीं था। चूँकि C ++ ने "C with Classes" के रूप में शुरुआत की, इसलिए सी पर सिलाला कक्षाओं की एक ग्राफ्टिंग की, और कभी भी एक साफ ब्रेक नहीं बनाया, यह कोई आश्चर्य नहीं है कि यह एक शुरुआती प्रयोग की तरह दिखता है।
डेविड थॉर्नले

1
@ ट्रिनिडाड: कोई भी भाषा OOP की अनुमति देती है। मैंने सादे पुराने सी में काफी अच्छा OO कोड देखा है। हाँ, यह हाथ से सभी आभासी विधि तालिकाओं को परिभाषित करने में दर्द है, लेकिन भाषा स्पष्ट रूप से इसकी अनुमति देती है।
Jan Hudec

4

सब कुछ एक वर्ग का हिस्सा होने के लिए मजबूर करना जरूरी नहीं है कि महान ओओ कोड प्राप्त हो।

एक गरीब प्रक्रियात्मक प्रोग्रामर को जावा में प्रोग्राम करने के लिए कहें और वे संभवतः एक क्लास लेंगे, इसे एक स्टैटिक मेन मेथड देंगे और इसमें कोड की 1000 लाइनें चिपकाएंगे। मुझे पता है कि मैंने इसे देखा है।

जावा में एक स्विच स्टेटमेंट है। मैंने switch( type ) { case typeA: bundles_of_code; break; case typeB: bundles_of_other_code; break }सी ++ और जावा कोड दोनों में देखा है ।

C ++ कई OO अवधारणाओं का समर्थन करता है लेकिन इसका मानक इसके द्वारा परिभाषित नहीं होता है, हालांकि मुझे लगता है कि बहुत कुछ इस बात पर निर्भर करता है कि आपका उद्देश्य क्या है।

C ++ में मुख्य "खराब" सिमेंटिक उन कक्षाओं के कॉपी-निर्माण की अनुमति देता है, जिससे एक वस्तु दूसरे में स्थानांतरित हो जाती है। आप इसे अक्षम कर सकते हैं लेकिन फिर आप एक फ़ंक्शन से वापस नहीं लौट सकते। सौभाग्य से यह C ++ 0x में संबोधित किया गया है।


3

OOP यह सुनिश्चित करने के बारे में नहीं है कि सब कुछ कक्षा में है या नहीं है। गैर-OO कोड को "विशुद्ध रूप से OO" भाषा में लिखना पूरी तरह से संभव है। उदाहरण के लिए, "मुख्य" को अक्सर एक वैश्विक कार्य के रूप में इंगित किया जाता है, लेकिन एक स्थिर मुख्य विधि को शामिल करने के लिए केवल एक वर्ग का आविष्कार करना गैर-ओओ के समान है।

सी ++ विभिन्न चीजों के मिश्रण के साथ सबसे अच्छा काम करता है; यह आश्चर्यजनक नहीं होना चाहिए, क्योंकि यह सबसे अच्छी चीजें सबसे अच्छा काम करती हैं। अक्सर OOP उन बहुत उपयोगी उपकरणों में से एक है।


2

C ++ का उपयोग OOP के लिए किया जा सकता है लेकिन यह Smalltalk की तरह 'शुद्ध' नहीं है। सी ++ आपको गैर-ओओपी भी करने देता है जो कि लोगों के बारे में बात कर सकता है।


2

हालांकि मैं भावना से असहमत हूं, लेकिन यह सच है कि C ++ का टाइप सिस्टम शुद्ध OOP नहीं है - "सब कुछ एक वस्तु है।" स्मॉलटॉक में संख्याओं (विशेष रूप से) को आसानी से बढ़ाया नहीं जा सकता है, जैसा कि वे कह सकते हैं। आप उदाहरण के लिए "2 + 2" के अर्थ को फिर से परिभाषित नहीं कर सकते (हालाँकि आप "दो + दो" के अर्थ को फिर से परिभाषित कर सकते हैं)।

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


1

एलन के के सी ++ के लिए पूरी तरह से वैध आपत्ति थी कि यह सी के शीर्ष पर एक मैक्रो भाषा थी।

"संदेश पासिंग" की धारणा बस यह विचार है कि कक्षाओं के उदाहरण स्मृति में रखे जाते हैं और वे उन तरीकों को उजागर करते हैं जिन्हें कहा जा सकता है। संदेश पासिंग सी + + में कार्यों के लिए पॉइंटर्स होल्डिंग vtables का उपयोग करके "सिम्युलेटेड" है।

यह कहने के लिए कि C ++ में मैसेज पासिंग मौजूद नहीं है, गलत है, जो कहना ज्यादा सटीक है, वह यह है कि मैसेज पासिंग अन्य भाषाओं का एक अभिन्न अंग है, जैसे कि स्मॉलटाक और जावा।

यह एक अत्यधिक शब्दार्थ भाषा डिज़ाइन तर्क है जिस पर मुझे संदेह है कि प्रश्नकर्ता के अनुभव स्तर से थोड़ा परे है।

कहा जा रहा है कि C ++ से नफरत करने के एक हजार कारण हैं, और इसे प्यार करने के बहुत कम कारण हैं।

सही हथौड़ा और सही नाखून की तलाश करने के बजाय, बनाने के लिए सही घर ढूंढें और फिर सही उपकरण ढूंढें ... जो अनुभव लेता है।

यह याद रखना भी महत्वपूर्ण है कि सिस्टम प्रोग्रामिंग में एलन के डर "शुद्ध OOP" नहीं है वास्तव में C ++ की ताकत है। हर किसी का अपना...


1
ऑब्जेक्टिव C भी C के शीर्ष पर मैक्रो भाषा के रूप में शुरू हुआ, लेकिन एक ऑब्जेक्ट ओरिएंटेड भाषा है।
Jan Hudec

1

मेरे विचार में, यह एक प्रयोज्य मुद्दे के रूप में इतना निश्चित मुद्दा नहीं है।

ऑब्जेक्ट एक अमूर्त उद्देश्य हैं, जो जटिल कार्यक्रमों के बारे में पढ़ना, लिखना और कारण को आसान बनाने के लिए हैं। एक व्यावहारिक प्रोग्रामर के लिए, चाहे वह भाषा "ऑब्जेक्ट-ओरिएंटेड" की किसी विशेष औपचारिक परिभाषा के सभी मानदंडों को पूरा करती हो (वहाँ कई प्रतिस्पर्धी प्रतीत होते हैं!) वास्तव में उतना महत्वपूर्ण नहीं है जितना कि यह प्रदान करने वाले उपकरण के बारे में सोचने के लिए उपयुक्त हैं या नहीं! उक्त वस्तुओं के संदर्भ में आपका कार्यक्रम - यानी, वास्तव में ओओपी के कथित उत्पादकता लाभों को पुनः प्राप्त करना।

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

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

C ++ ऑब्जेक्ट-ओरिएंटेड है, लेकिन अप्रिय और अपूर्ण रूप से: इसके उपयोगकर्ताओं को यह सुनिश्चित करने के लिए बहुत प्रयास करना पड़ता है कि उनका डेटा वास्तव में गलत बिट्स के बजाय "वास्तविक" ऑब्जेक्ट्स की तरह व्यवहार करता हैउस ने कहा, इसके जीवन काल में C ++ में बहुत सारे कोड लिखे गए हैं, अधिकांश इसका उपयोग कक्षाओं और गतिशील प्रेषण का उपयोग करते हैं, इसलिए यह स्व-साक्ष्य है जो आप व्यावहारिक OOP के लिए उपयोग कर सकते हैं।


-1 FQA को संदर्भित करने के लिए जो एक गंभीर जवाब होना चाहिए। FQA विकृतियों, अर्ध-सत्य और गलतफहमी का एक घोंसला है।
डेविड थॉर्नले

@DavidThornley क्या विशेष उद्धरण एक विरूपण, अर्ध-सत्य या गलतफहमी है?
एलेक्स पी

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

@DavidThornley FQA का दावा है कि एक उपयोगी OO भाषा में ये चीजें होनी चाहिए - जो कि पूछे जाने वाले प्रश्न के अनुरूप है (C ++ "उपयुक्त"?) है। मुझे लगता है कि नंगे-हड्डियों की परिभाषा के बारे में एक दावा वास्तव में यह नहीं बताता है कि ... "बताने की क्षमता": एक वस्तु को एक्सेस करने वाली एक सामान्य त्रुटि व्यवहार जो वास्तव में वहां नहीं है, एक सूचक का कुछ अनैतिक या पहले से अधिलेखित डेटा का पालन करके; और आपका प्रोग्राम ख़ुशी से उस कचरे को ले जाएगा और उसे डेटा के रूप में व्याख्या करेगा, और तब तक अन्य कचरा डेटा तक कचरा पॉइंटर्स का पालन करेगा जब तक कि यह एक आउट-ऑफ-बाउंड एड्रेस या कुछ बड़े पैमाने पर त्रुटि न हो।
एलेक्स पी।

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

-1

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


क्या आपके पास अपने तर्कों के लिए कोई वास्तविक समर्थन कारण हैं? आप यह दावा कर रहे हैं और दावा कर रहे हैं कि जो लोग असहमत हैं, उनसे गलती की जानी चाहिए, या यदि वे इसे अलग तरीके से देखते हैं, या शायद उन्होंने OO की आपकी सटीक परिभाषा साझा की है, तो उनके विचार बदल जाएंगे।
डेविड थोरले

काफी उचित। आप इस लेख को पढ़ सकते हैं । मुझे लगता है कि मैं जो कह रहा था वह यह है कि सी ++ सख्त एलन के अर्थ में "ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग" नहीं है। हालाँकि यदि आप ओओपी को व्यवहार के साथ डेटा संरचना के रूप में परिभाषित करते हैं तो आप सी ++ को ओओपी के रूप में मान सकते हैं। मेरे मन में हालांकि उच्च स्तरीय प्रक्रियात्मक प्रोग्रामिंग अमूर्तता के रूप में सी ++ वर्ग को देखना अधिक सटीक है। एक c ++ क्लास एक Kay स्टाइल ऑब्जेक्ट की तुलना में बहुत अधिक कुशल है, लेकिन समरूपता के लिए बदतर है। व्यक्तिगत रूप से मुझे लगता है कि c ++ क्लास एक बेहतरीन डिज़ाइन है।
कष्टप्रद_संकट

1
लिंक के लिए धन्यवाद, लेकिन यह केवल यह बताता है कि एलन के का मतलब क्या था। इसके अलावा, मैं असहमत हूं कि स्मॉलटाक को आम तौर पर पहली OO भाषा माना जाता है, और विकिपीडिया मेरे साथ सहमत है कि सिमाला, दो भाषाओं में से एक स्ट्रॉस्ट्रुप को सी के साथ मिलकर बनाई गई थी। मुझे आपके दावे में दिलचस्पी है कि C ++ क्लास एक ऑब्जेक्ट टेम्प्लेट की तुलना में एक उच्च स्तरीय प्रक्रियात्मक प्रोग्रामिंग एब्स्ट्रैक्शन है, लेकिन मुझे अभी भी समझ में नहीं आया कि आप ऐसा क्यों सोचते हैं।
डेविड थॉर्नले

ऑब्जेक्ट ओरिएंटेशन शायद एक व्यक्तिपरक शब्द है, अगर हम उस पर सहमत हो सकते हैं। लेकिन मैं एक केआई ऑब्जेक्ट को कोड को डिकूप करने और इस अर्थ में समवर्ती मॉड्यूलरिटी को पेश करने के लिए एक अधिक प्राकृतिक तरीके के रूप में देखता हूं कि प्रत्येक वस्तु संदेश पासिंग के माध्यम से बातचीत करते हुए मिनी-कंप्यूटर की तरह भूमिका निभाती है। इस मॉडल के तहत 'b / c के बीच में कोई कोड नहीं होना चाहिए' कार्यक्रम के पूरे तर्क को कोशिकाओं और संदेशों के रूप में व्यक्त किया जा सकता है। 'वर्गों' के उपयोग की तुलना में आमतौर पर बीच में कुछ प्रक्रियात्मक गोंद कोड की आवश्यकता होती है (वास्तविक प्रतिरूपकता का अभाव) लेकिन इसका लाभ यह है कि कक्षाएं कहीं अधिक कुशल हैं।
झुंझला_सक्विद

-1

स्टीव येजे ने इसे सबसे अच्छा कहा :

C ++ पृथ्वी पर सबसे नीची भाषा है, जिसमें सबसे कम भाव है। यह अपने बारे में नहीं जानता।

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


किस तरह से C ++ सबसे कम भावुक भाषा है? किसी भाषा को भावुक होने का क्या मतलब है? अगर आपको लगता है कि इसमें प्रतिबिंब क्षमताओं का अभाव है, तो यह काफी सामान्य है, और निश्चित रूप से C ++ को भीड़ से बाहर नहीं निकालता है।
डेविड थॉर्नले

2
पृथ्वी पर आप यह कैसे कह सकते हैं कि उसने इसे "सर्वश्रेष्ठ" कहा है? मुझे नहीं पता कि उस यादृच्छिक बोली का क्या मतलब है।
user16764

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

धन्यवाद। मुझे विश्वास नहीं हो रहा है कि मैं -3 के लिए कह रहा हूं कि प्रतिबिंब के बिना एक भाषा OOP का एक अच्छा उदाहरण नहीं है।
जॉन क्रॉमार्टी

1
@ जॉनक्रोमार्टी, क्या आप अपने उत्तर में उस बिंदु पर विस्तार से बता सकते हैं?
जेरेमी हीलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.