2012-11-03 15 views
8

के बीच अंतर मैं सी ++ के संदर्भ का अध्ययन कर रहा हूं, और अब मैं परिवर्तनीय नाम और संदर्भ के बीच अंतर से काफी उलझन में हूं। परीक्षण कोड नीचे है:परिवर्तनीय संदर्भ और नाम

class TestClass{ 
private: 
    int num; 
public: 
    TestClass(int n):num(n){ 
     cout<<this<<" : init of : " <<this->num<<endl; 
    } 

    TestClass(const TestClass& t):num(t.num){ 
     cout<<this<<" : copyInit of : " <<this->num<<endl; 
    } 

}; 

int main(int argc, const char * argv[]){ 

    TestClass t = *(new TestClass(55)); //just to test copy initialization 

    const TestClass t2 = TestClass(100); //option1 
    const TestClass &t2 = TestClass(100); //option2 


} 

तो अब मेरे पास ऑब्जेक्ट बनाने में दो विकल्प हैं, जो एक-दूसरे के साथ अनन्य हैं।

मेरी समझ में, यदि मैं विकल्प 2 का उपयोग करता हूं, तो संकलक स्टैक मेमोरी में एक अस्थायी वस्तु बनाता है और संदर्भ मान को t2 पर देता है।

यदि यह सही है, तो मैं विकल्प 1 को verbalize या समझा सकता हूं? ऐसा लगता है कि वही ऑब्जेक्ट स्टैक मेमोरी में बनाया गया है और कंप्यूटर उस ऑब्जेक्ट पर 't2' नाम देता है, लेकिन मुझे स्पष्ट रूप से समझ में नहीं आता कि यह विकल्प 1विकल्प 2 के साथ अलग है क्योंकि चर और संदर्भ का नाम है कुछ उलझन में।

इसके अलावा, वैकल्पिक रूप से स्विचिंग विकल्प, मैं देख सकता था कि ऑब्जेक्ट प्रत्येक मामले में विभिन्न मेमोरी स्थानों में बनाए जाते हैं। (जैसे OPTION1 की वस्तु 0x7fff5fbff828 में बनाया गया था, और कहा कि या OPTION2 0x7fff5fbff820 में था)

आप कृपया समझा सकते हैं

1. एक चर नाम (OPTION1) और संदर्भ (OPTION2) के बीच अंतर क्या ।

2. कैसे चीजें विकल्प 1 में अलग तरह से काम 2.

3. क्यों वस्तुओं या तो मामलों में अलग स्मृति स्थान में बनाए जाते हैं और।

अग्रिम में, आपकी मदद के लिए धन्यवाद!

+0

मैं इस सवाल पर एक जवाब का प्रयास होगा, लेकिन अपने 3 प्रश्न मुझे confuses हैं के बावजूद ... करता है कोड संकलित? –

+0

@LewsTherin यदि आप पहले विकल्प का नाम बदलते हैं, तो यह संकलित करता है। –

+0

ध्यान दें कि 'टेस्टक्लास टी = * (नया टेस्टक्लास (55)) में;' अब आप आवंटित स्मृति को हटा नहीं सकते हैं। –

उत्तर

1

1) एक चर नाम (विकल्प 1) और संदर्भ (विकल्प 2) के बीच क्या अंतर है।

नाम स्थिर प्रकार है। संदर्भ व्युत्पन्न कक्षाओं से बंधे जा सकते हैं - हम सटीक प्रकार के निर्दिष्ट वस्तुओं को नहीं जानते हैं।

अपने बहुत उदाहरण में - विकल्प 2 के लिए - आप इसे करने के लिए स्थिरांक संदर्भ बनाने के द्वारा अस्थायी वस्तु के जीवनकाल बढ़ाया - देख http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

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


2) कैसे चीजें विकल्प 1 और 2 में अलग तरह से काम।

यदि आप वर्चुअल फ़ंक्शन को कॉल करते हैं - तो परिवर्तनीय नाम के लिए आप जानते हैं कि कौन से फ़ंक्शन को संदर्भित किया जाएगा, संदर्भों के लिए - आप अपने से अधिक जटिल उदाहरण में नहीं जान सकते हैं।


3) क्यों वस्तुओं या तो मामलों में अलग स्मृति स्थान में बनाया जाता है।

वे अलग-अलग वस्तुएं हैं, वे एक ही समय में जीवन हैं - तो उनका स्मृति स्थान समान क्यों होना चाहिए?

अन्य अंतर यह है कि विकल्प 1 के लिए आप स्वत: चर, विकल्प 2 के लिए यह अस्थायी चर रहा है बनाया है - दोनों अलग स्मृति का उपयोग कर सकते हैं (ढेर बनाम रजिस्टर या बस temporaries के लिए कुछ आरक्षित स्मृति)


पर विचार करें अधिक जटिल उदाहरण:

class TestClass{ 
protected: 
    int num; 
public: 
    TestClass(int n):num(n){ 
     cout<<this<<" : init of : " <<this->num<<endl; 
    } 
    TestClass(const TestClass& t):num(t.num){ 
     cout<<this<<" : copyInit of : " <<this->num<<endl; 
    } 
    virtual void printNum() const { cout << "NUM: " << num << endl; } 
}; 

class TestClassDerived : public TestClass { 
public: 
    TestClassDerived(int n):TestClass(n){} 
    virtual void printNum() const { cout << "DERIVED NUM: " << num << endl; } 
}; 


int main(int argc, const char * argv[]){ 
    const TestClass t1 = TestClass(100); //option1 
    const TestClass &t2 = TestClassDerived(100); //option2 
    t1.printNum(); 
    t2.printNum(); 
} 
+0

+1 :) – Caribou

+0

आपका क्या मतलब है, "आप नहीं जानते"? ऐसा लगता है कि कौन सा समारोह बुलाया जाएगा। स्पष्टीकरण के लिए – Beta

+1

धन्यवाद। क्या मैं आपको थोड़ा और विवरण के लिए पूछ सकता हूं? ए 1) उत्तर 1 में, क्या आप स्थिर प्रकार के बारे में अधिक समझा सकते हैं? जब मैंने आपके उदाहरण कोड को 'कॉन्स्ट टेस्ट क्लास टी 2 = टेस्ट क्लासडेरिव (100); जैसे बदल दिया,' मैं देख सकता था कि कॉपी प्रारंभिकरण हुआ और सुपर क्लास प्रकार की एक नई वस्तु t2 को असाइन की गई है। फिर, 'स्थिर प्रकार के रूप में चर नाम' का अर्थ यह है कि यह हमेशा निर्दिष्ट प्रकार के रूप में निर्दिष्ट व्युत्पन्न वस्तु की एक प्रति बनाकर ऑब्जेक्ट को अपने स्वयं के प्रकार के साथ प्रस्तुत करेगा? ** - जारी रखने के लिए ** – noclew

3
const TestClass t2 = TestClass(100); //option1 
const TestClass &t2 = TestClass(100); //option2 

Option1:

टेस्टक्लास की कॉपी कन्स्ट्रक्टर को कॉल करता है और "=" के दाईं ओर बनाए गए अस्थायी में गुजरता है। प्रतिलिपि की प्रतिलिपि वस्तुओं की अनावश्यक प्रतिलिपि को समाप्त करती है (नीचे पियटर्स कमेंट देखें)।

विकल्प 2:

आप 1 वस्तु, अस्थायी, जो संदर्भ के लिए बाध्य हो जाता है पैदा करते हैं।

  1. क्या एक चर नाम (OPTION1) और संदर्भ (OPTION2) के बीच अंतर है।

संपादित करें: मैं इस से पहले नहीं पता था, लेकिन वास्तविक वास्तव में विकल्प 1 में एक दूसरे आवंटन नहीं है (धन्यवाद पायोत्र) इस इलिजन जो एक संकलक अनुकूलन तकनीक को संदर्भित करता है नकल की वजह से है कि वस्तुओं की अनावश्यक प्रतिलिपि को समाप्त करता है।

अपने शब्दों का उपयोग करने के लिए, "परिवर्तनीय नाम" स्मृति का एक ब्लॉक है जिसमें डेटा होता है। संदर्भ इस सूचक में एक सूचक की तरह है कि यह किसी अन्य "परिवर्तनीय नाम" को इंगित करता है, लेकिन इसे प्रारंभ किया जाना चाहिए, और कभी शून्य नहीं होता है।

  1. कैसे चीजें विकल्प 1 में अलग तरह से काम करते हैं और 2.

दूसरों ने कहा है कि विकल्प 1 एक स्थिर प्रकार, (जहां विकल्प 2 के रूप में एक व्युत्पन्न का एक उदाहरण को इंगित कर सकता है TestClass से) वस्तु।

  1. किसी भी मामले में विभिन्न स्मृति स्थान में वस्तुएं क्यों बनाई जाती हैं।

जा रहा है "समान" TestObjects (100) वे व्यक्तिगत उदाहरणों और इसलिए अलग स्मृति (पते) में

+0

क्या आप दिखा सकते हैं कि विकल्प 1 में ऑब्जेक्ट कैसे बदला जा सकता है? यह मुझे 'const' लग रहा है। – Beta

+0

@ बीटा अहमम ...: | मैं – Caribou

+0

संपादित करूंगा कोई सबूत कि विकल्प 1 में अतिरिक्त आवंटन हुआ? Ideone पर मेरा उदाहरण देखें: http://ideone.com/VJiVLf। कोई अतिरिक्त आवंटन नहीं ... – PiotrNycz

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