2013-04-11 5 views
5

मुझे यह समझने में सहायता करें, अगर मैं सी ++ 11 समेत सभी सी ++ मानकों पर विचार करता हूं, तो यह कहना सही है कि केवल ऑब्जेक्ट जिसे मैं सौदा कर सकता हूं वह कक्षा का एक उदाहरण है?सी ++ में "क्लास इंस्टेंस" ऑब्जेक्ट का एकमात्र प्रकार है?

लैम्बडास जैसे अन्य खिलाड़ियों के बारे में क्या? पीओडी का एक उदाहरण एक वस्तु माना जाता है?

मुझे पता है कि यह एक छोटी सी जानकारी की तरह लगता है, लेकिन ज्यादातर बार मुझे अन्य भाषाओं की अवधारणाओं की तुलना करने में कठिनाई होती है जब मुझे इस तरह की समस्याएं होती हैं कि एक वस्तु क्या है और क्या नहीं है, खासकर कार्यात्मक ओओपी भाषाओं में।

+0

'int x;' 'x' कक्षा का एक उदाहरण है? – Pubby

+0

@ पब्बी लेकिन मेरा सवाल है: एक वस्तु क्या है? प्रोग्रामिंग दुनिया में इस शब्द के लिए किस तरह की परिभाषा मौजूद है और सी ++ परिभाषाओं में क्या परिणाम हैं? जो मैं जानता हूं वह int std :: int से एक प्रकार है, इसलिए यह एक वर्ग है, इसलिए इस मामले में x यह किसी ऑब्जेक्ट के लिए एक लेबल है, लेकिन मैंने यह परिभाषित नहीं किया है कि वास्तव में कोई ऑब्जेक्ट क्या है। – user2269624

+1

ऐसी कक्षा नहीं है जैसे 'std :: int'। –

उत्तर

8

यदि मैं सी ++ 11 समेत सभी सी ++ मानकों पर विचार करता हूं, तो यह कहना सही है कि एकमात्र वस्तु जिसे मैं सौदा कर सकता हूं वह एक वर्ग का उदाहरण है?

नहीं, यह सही नहीं है।

सी ++ में, "वस्तु" शब्द भंडारण के एक क्षेत्र को संदर्भित करता है जिसे गुणों (जैसे कि इसके प्रकार) के अनुसार एक विशेष व्याख्या दी जाती है जिसे वस्तु से सम्मानित किया जाता है।

एक सी ++ प्रोग्राम, बनाएं, नष्ट करने के लिए, का उपयोग देखें, और वस्तुओं में हेरफेर में निर्माणों:

प्रति पैरा सी ++ 11 स्टैंडर्ड 1.8/1

एक ऑब्जेक्ट स्टोरेज का क्षेत्र है। [नोट: कोई फ़ंक्शन कोई ऑब्जेक्ट नहीं है, भले ही यह ऑब्जेक्ट्स में स्टोरेज पर रखता है या नहीं। -जेंड नोट] एक ऑब्जेक्ट एक परिभाषा (3.1) द्वारा बनाई गई है, एक नई अभिव्यक्ति (5.3.4) या आवश्यकता होने पर कार्यान्वयन (12.2) द्वारा। किसी ऑब्जेक्ट के गुण निर्धारित किए जाते हैं जब ऑब्जेक्ट बनाया गया है। किसी ऑब्जेक्ट का नाम हो सकता है (क्लॉज 3)। किसी ऑब्जेक्ट में स्टोरेज अवधि (3.7) होती है जो को अपने जीवनकाल (3.8) को प्रभावित करती है। किसी ऑब्जेक्ट में एक प्रकार (3.9) होता है। शब्द ऑब्जेक्ट प्रकार उस प्रकार को संदर्भित करता है जिसके साथ ऑब्जेक्ट बनाया गया है। कुछ वस्तुएं polymorphic (10.3) हैं; कार्यान्वयन से संबंधित ऐसी प्रत्येक वस्तु को उत्पन्न करता है जो प्रोग्राम निष्पादन के दौरान उस ऑब्जेक्ट के प्रकार को निर्धारित करना संभव बनाता है। अन्य ऑब्जेक्ट्स के लिए, उसमें पाए गए मानों की व्याख्या अभिव्यक्ति के प्रकार (क्लॉज 5) द्वारा उपयोग की जाती है, जो उन्हें एक्सेस करने के लिए उपयोग की जाती है।

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

लैम्बडास जैसे अन्य खिलाड़ियों के बारे में क्या?

लैम्ब्डा भाव सरल समारोह वस्तुओं बनाने के लिए एक संक्षिप्त तरीके से प्रदान करते हैं:

lambdas अनाम functors (पैराग्राफ 5.1.2/1) को परिभाषित करने के लिए वास्तव में वाक्यात्मक चीनी हैं। [...]

इसके अलावा (प्रति अनुच्छेद 5.1।2/2):

लैम्बडा-अभिव्यक्ति का मूल्यांकन एक अस्थायी अस्थायी (12.2) में परिणाम का मूल्यांकन। इस अस्थायी को बंद ऑब्जेक्ट कहा जाता है। [...] [नोट: एक बंद ऑब्जेक्ट फ़ंक्शन ऑब्जेक्ट (20.8) की तरह व्यवहार करता है। - अंत टिप्पणी]

इसलिए, lambdas भाव जिसका मूल्यांकन एक अस्थायी वस्तु के निर्माण में परिणाम हैं (ताकि हाँ, कुछ अर्थों में एक कह सकते हैं lambdas भी वस्तुओं, या बल्कि वे एक उपज कि कर रहे हैं वस्तु)।

+0

मुझे यह नहीं पता कि यह तथ्य क्यों है कि यह समृद्ध है, यदि यह परिभाषा एक राज्य को बनाए रखने के बारे में है, तो यह तथ्य क्यों अस्थायी है कि यह प्रासंगिक है, मेरा मतलब है कि सी ++ कोड में कुछ भी जीवन भर है, तथ्य यह है कि कुछ ऑफ़र डेटा के लिए एक छोटा जीवनकाल यह इतना प्रासंगिक है? तो क्यों lambdas वस्तुओं नहीं हैं? – user2269624

+0

@ user2269624: एक अस्थायी एक वस्तु है। बोल्ड फ़ॉन्ट का जोर देने के लिए यही था। लेकिन हां, तथ्य यह है कि लैम्ब्डा अभिव्यक्तियों का मूल्यांकन वस्तुओं के मूल्यांकन के बाद भी उसी अनुच्छेद में कहा गया है, इसलिए मुझे लगता है कि मैं जोर को हटा सकता हूं –

2
C++ एक वस्तु में

एक संबद्ध प्रकार

उदा के साथ भंडारण का एक क्षेत्र है एक int

क्षेत्र नहीं की जरूरत है जरूरी सन्निहित

एक उदाहरण के रूप

, एक वस्तु की आभासी एकाधिक वंशानुक्रम भागों के साथ हो सकता है हो सकता है (के अर्थ में, कुछ स्थितियों मौजूद है, जहां यह हो गया है) के आसपास

फैल
2

पारंपरिक ओओपी "ऑब्जेक्ट" की धारणा को "पॉलिमॉर्फिक इकाई" के रूप में परिभाषित करता है जो विधियों और डेटा को लेता है, और अन्य ऑब्जेक्ट्स से एल्गोरिदम से संदर्भित किया जा सकता है।

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

सी ++ प्रोग्राम परंपरागत OOP परिभाषा के बाद, (स्मार्ट) द्वारा संदर्भित वर्गों के साथ समाप्त होता है।

आधुनिक सी ++ ऑब्जेक्ट का उपयोग मूल्य-प्रतिलिपि या सेमेन्टिक्स को स्थानांतरित करने के रूप में करता है, और टेम्पलेट्स और जेनेरिक एल्गोरिदम और टाइप गुणों के साथ संकलन समय पर पॉलीमोर्फिज्म को संबोधित करता है।

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

lambdas के बारे में, यह सही अर्थों में वे भाव (स्वयं वस्तुओं नहीं) गुमनाम टाइप वस्तुओं लौट रहे हैं।

तो कहा कि वे वस्तुओं रहे हैं अनुचित है: a+b यह एक वस्तु ही नहीं है: यह एक वस्तु (अभिव्यक्ति की परिणाम) पैदा करता है।एक ही [](){} के लिए है: यह एक वस्तु ही नहीं है: यह एक वस्तु पैदा करता है, आप की तरह

auto fn = [](){}; //create a lambda and assign to fn. 
fn();    //just calls it 

में fn प्रकार

class lambda_uniquename 
{ 
public: 
    void operator()() 
    {} 
}; 

की तरह कुछ वस्तु यहाँ है, यहां तक ​​कि दुकान कर सकते हैं,, lambda वर्ग नहीं है, लेकिन fn चर।

संबंधित मुद्दे