2009-11-16 28 views
5

सी ++ में किस प्रकार का तत्काल किया जा सकता है?तत्काल क्या किया जा सकता है?

मुझे पता है कि निम्नलिखित प्रत्येक सीधे Foo का एक उदाहरण बनाने के लिए:

Foo bar; 
Foo *bizz = new Foo(); 

हालांकि, के बारे में के साथ निर्मित प्रकार? क्या निम्नलिखित int के दो उदाहरण बनाते हैं, या उदाहरण के लिए गलत शब्द का उपयोग करना है और स्मृति आवंटित की जा रही है?

int bar2; 
int *bizz2 = new int; 

पॉइंटर्स के बारे में क्या? क्या उपरोक्त उदाहरण int * उदाहरण बनाते हैं, या बस int * के लिए स्मृति आवंटित करते हैं?

42 या 3.14 जैसे अक्षरों का उपयोग करना भी एक उदाहरण बनायेगा?

मैंने तर्क देखा है कि यदि आप किसी प्रकार को उपclass नहीं कर सकते हैं, तो यह एक वर्ग नहीं है, और यदि यह कक्षा नहीं है, तो इसे तत्काल नहीं किया जा सकता है। क्या ये सच है?

उत्तर

4

जब तक हम सी ++ के बारे में बात कर रहे हैं, केवल एकमात्र आधिकारिक स्रोत आईएसओ मानक है। वह क्लास और फ़ंक्शन टेम्पलेट्स के अलावा किसी भी चीज़ के लिए "तत्काल" शब्द का उपयोग नहीं करता है।

हालांकि, यह "उदाहरण" शब्द का उपयोग करता है। उदाहरण के लिए:

स्वचालित संग्रहण अवधि (3.7.2) के साथ प्रत्येक ऑब्जेक्ट का एक उदाहरण प्रत्येक प्रविष्टि के साथ अपने ब्लॉक में जुड़ा हुआ है।

ध्यान दें कि सी ++ भाषा में, एक int lvalue भी एक "वस्तु" है:

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

new स्पष्ट रूप से भंडारण के क्षेत्रों बनाता है के बाद से, कुछ भी इस प्रकार बनाया एक वस्तु है, और, विनिर्देश के मिसाल के बाद, एक उदाहरण कहा जा सकता है।

+0

बहुत अच्छा। धन्यवाद। =] – strager

+0

यह अब तक का सबसे अच्छा जवाब है। सी ++ मानक और सामान्य ओओपी शब्दावली के बीच अंतर दिलचस्प है। अधिकांश ओओपी प्रोग्रामर शायद 'int x' जैसे कुछ' int 'के उदाहरण को कॉल नहीं करेंगे, और न ही उन्हें किसी वस्तु के रूप में' int 'को संदर्भित करने की संभावना होगी; लेकिन फिर भी इसे संदर्भित करने के लिए तकनीकी रूप से सही होगा। –

+1

हां, "उदाहरण" जैसा कि पावेल द्वारा उद्धृत किया गया है, सामान्य ओओपी भावना में बिल्कुल उपयोग नहीं किया जा रहा है, क्योंकि यह "किसी ऑब्जेक्ट का उदाहरण" नहीं है, न कि "एक प्रकार का उदाहरण"। मुझे लगता है कि इसे "एक अलग वस्तु ..." से बदला जा सकता है और इसका मतलब एक ही बात है। मैं अनुमान लगाता हूं कि अधिकांश ओओपी प्रोग्रामर एक वस्तु के रूप में एक int को संदर्भित नहीं करेंगे क्योंकि उन्हें जावा पर प्रशिक्षित किया गया था, जहां वास्तव में 'int'' ऑब्जेक्ट 'नहीं है। शुद्ध ओओपी भाषाएं अंतर्निर्मित प्रकारों के लिए अपवाद नहीं बनाती हैं, इसलिए उनके पूर्णांक वस्तुएं हैं। रुबी में आप गतिशील रूप से बंदर-पैच विधियों को कक्षा में कर सकते हैं जो उन्हें दर्शाता है, '3.minutes' बराबर 180 बनाने के लिए। –

2

सी ++ एक 'उदाहरण' और 'इन्स्तांत' में केवल कक्षा

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

लेकिन C++ बात का एक उदाहरण है 'सूचक' एक कक्षा नहीं है और एक सूचक एक कक्षा

का एक उदाहरण नहीं है

भी देखते हैं - कैसे pinheads

+0

हालांकि अन्य भाषाएं हैं (उदाहरण के लिए छोटे-छोटे स्थान) जहां सबकुछ एक वस्तु है, इसलिए आपको पूर्णांक के उदाहरण मिलते हैं। – pm100

+0

"सी ++ ए 'इंस्टेंस' और 'तत्काल' में केवल कक्षाओं के साथ जुड़ा हुआ है - स्रोत? –

2

एक "उदाहरण" की अवधारणा पर कई स्वर्गदूतों कुछ है कि सी के ++ वास्तव में आंतरिक है नहीं है - मूल रूप से आप "वे बातें जिनकी एक निर्माता और चीजें हैं जो नहीं है" है।

तो, सभी प्रकारों का आकार है, उदा। एक int आमतौर पर 4 बाइट्स होता है, कुछ चींटियों वाला एक स्ट्रक्चर 8 होने वाला होता है और इसी तरह। अब, उस संरचना पर एक कन्स्ट्रक्टर थप्पड़ मारो, और यह कक्षा की तरह दिखने (और व्यवहार) शुरू होता है। अधिक विशेष रूप से:

int foo; // <-- 4 bytes, no constructor 

struct Foo 
{ 
    int foo; 
    int bar; 
}; // <-- 8 bytes, no constructor 

struct Foo 
{ 
    Foo() : foo(0), bar(0) {} 
    int foo; 
    int bar; 
}; // <-- 8 bytes, with constructor 

अब, आप इन प्रकार के किसी भी ढेर पर या ढेर पर रह सकते हैं। जब आप '12 f51; इसके दायरे के बाद दूर चला जाता है (उदाहरण के लिए फ़ंक्शन कॉल के अंत में)। यदि आप "नया" के साथ कुछ बनाते हैं तो यह ढेर पर जाता है और जब तक आप को हटाते हैं, तब तक स्मृति में रहने के लिए अपनी जगह प्राप्त होती है। दोनों मामलों में कन्स्ट्रक्टर, यदि वहां है, तो तत्काल के दौरान बुलाया जाएगा।

1

"नया int" करना असामान्य है, लेकिन इसकी अनुमति है। आप कन्स्ट्रक्टर को 0 या 1 तर्क भी पास कर सकते हैं। मुझे यकीन नहीं है कि "नया int()" का अर्थ है कि यह 0-प्रारंभिक है (मैं हां अनुमान लगाता हूं) "नई int" से अलग है।

जब आप स्टैक पर एक मान परिभाषित करते हैं, तो इसे आमतौर पर "आवंटित स्मृति" नहीं कहा जाता है (हालांकि इसे सिद्धांत में ढेर पर स्मृति मिल रही है, यह संभव है कि मूल्य केवल CPU रजिस्टरों में ही रहता है)।

साहित्य को प्रोग्राम मेमोरी में जरूरी नहीं है; सीपीयू निर्देश सीधे डेटा एन्कोड कर सकते हैं (उदा। रजिस्टर बी में 42 डाल दें)।शायद मनमाने ढंग से फ़्लोटिंग पॉइंट स्थिरांक का पता है।

+0

मैं मुख्य रूप से उत्तर देने के लिए देख रहा हूं कि एक 'int' और अन्य अंतर्निर्मित प्रकार * तत्काल * हो सकते हैं। मुझे लगता है कि, अन्य उत्तरों और आपके उत्तर के आधार पर, एक 'int' में एक कन्स्ट्रक्टर है, इस प्रकार एक उदाहरण हो सकता है, सही? – strager

+0

नहीं, int में कोई कन्स्ट्रक्टर नहीं है। सी ++ पीओडी और गैर-पीओडी प्रकारों के बीच अंतर करता है, जहां पीओडी प्रकारों में रचनाकार, सदस्य कार्य, निजी सदस्य चर, आदि हो सकते हैं, और गैर-पीओडी प्रकार नहीं हो सकते हैं। –

+0

पीओडी structs में रचनाकार हैं। उनके पास _non-trivial_ रचनाकार नहीं हैं। –

3

जहां तक ​​मैं कह सकता हूं, आप वास्तव में यहां शब्दावली के बारे में पूछ रहे हैं। सी ++ मानक द्वारा निर्मित एकमात्र असली भेद पीओडी प्रकार और गैर-पीओडी प्रकार है, जहां गैर-पीओडी प्रकारों में उपयोगकर्ता द्वारा परिभाषित कन्स्ट्रक्टर, सदस्य कार्य, निजी चर, आदि, और पीओडी प्रकार जैसी विशेषताएं नहीं हैं। int और float जैसे मूल प्रकार पीओडी के पीओडी और सी-structs के सरणी हैं, निश्चित रूप से पीओडी हैं।

से

अलावा (और साथ अतिव्यापी) सी ++, एक "उदाहरण" वस्तु उन्मुख प्रोग्रामिंग में की अवधारणा आम तौर पर स्मृति में एक वस्तु के लिए जगह आवंटित करने, और उसके बाद एक निर्माता के साथ आरंभ करने के लिए संदर्भित करता है। चाहे यह स्टैक या ढेर, या उस मामले के लिए स्मृति में किसी भी अन्य स्थान पर किया जाता है, काफी हद तक अप्रासंगिक है।

हालांकि, सी ++ मानक सभी डेटा प्रकारों "ऑब्जेक्ट्स" पर विचार करता है। उदाहरण के लिए, 3.9 में यह कहते हैं:

"प्रकार टी की वस्तु प्रतिनिधित्व एन अहस्ताक्षरित चार वस्तुओं के प्रकार टी, जहां एन sizeof के बराबर होती है (टी) वस्तु द्वारा लिया के अनुक्रम है .. "

तो मूल रूप से, सी ++ मानक द्वारा निर्मित एकमात्र भेद पीओडी बनाम गैर-पीओडी है।

+0

मानक उद्धरण महान है। धन्यवाद! सही दिशा में एक कदम की तरह लग रहा है। – strager

+0

आपका कथन "मूल प्रकार जैसे 'int' और' float' निश्चित रूप से गैर-पीओडी हैं, जैसे कि पीओडी के पीओडी और सी-स्ट्रक्चर के सरणी हैं।" गलत लगता है क्या आपका मतलब "पीओडी" के साथ "गैर-पीओडी" को प्रतिस्थापित करना है और इसके विपरीत? – strager

+0

ठीक है, क्षमा करें - वह एक टाइपो था।मैंने कुछ हद तक पोस्ट संपादित किया, और उस गलती को ठीक किया। –

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

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