2012-01-13 13 views
26

संभव डुप्लिकेट:
What are the differences between pointer variable and reference variable in C++?एम्पर्सेंड (&) साइन सी ++ में कैसे काम करता है?

यह मैं भ्रामक:

class CDummy 
{ 
public: 
    int isitme (CDummy& param); 
}; 

int CDummy::isitme (CDummy& param) 
{ 
    if (&param == this) 
    { 
     return true; //ampersand sign on left side?? 
    } 
    else 
    {  
     return false; 
    } 
} 

int main() 
{ 
    CDummy a; 
    CDummy* b = &a; 

    if (b->isitme(a)) 
    { 
    cout << "yes, &a is b"; 
    } 

    return 0; 
} 

सी & में आम तौर पर एक वर का पता होता है। इसका मतलब क्या है? क्या यह पॉइंटर नोटेशन का एक शानदार तरीका है? कारण यह है कि मैं यह मान रहा हूं कि यह एक सूचक संकेत है क्योंकि यह सब के बाद एक सूचक है और हम दो पॉइंटर्स की समानता की जांच कर रहे हैं। धन्यवाद।

1) एक चर

int x; 
void* p = &x; 
//p will now point to x, as &x is the address of x 

2) का पता लेने के एक समारोह

void foo(CDummy& x); 
//you pass x by reference 
//if you modify x inside the function, the change will be applied to the original variable 
//a copy is not created for x, the original one is used 
//this is preffered for passing large objects 
//to prevent changes, pass by const reference: 
void fooconst(const CDummy& x); 

3) के संदर्भ द्वारा एक तर्क पारित:

+10

कोई अनादर के इरादे से, यह किसी भी प्रारंभिक सी ++ पुस्तक के पहले कुछ अध्यायों में शामिल होगा। क्या मेरा सुझाव है कि आप एक से परामर्श लें? –

+0

अच्छी तरह से मैं cplusplus.com से पढ़ रहा हूं और उनके पास यह उदाहरण है। – infinitloop

+4

"* मैं cplusplus.com से पढ़ रहा हूं *" यह आपकी पहली गलती है। साइट एक अच्छा संदर्भ नहीं है, और ** विशेष रूप से ** एक अच्छा सीखने संसाधन नहीं है। – ildjarn

उत्तर

33

शुरू करने के लिए, ध्यान दें कि

this 

वर्ग अपनी में करने के लिए एक विशेष सूचक (== स्मृति पते) है। सबसे पहले, एक वस्तु instantiated है:

CDummy a; 

इसके बाद, एक सूचक instantiated है:

b = &a; 

:

CDummy *b; 

इसके बाद, a की स्मृति पता सूचक b को सौंपा गया है अगला, विधि CDummy::isitme(CDummy &param) कहा जाता है:

b->isitme(a); 

एक परीक्षण इस विधि के अंदर मूल्यांकन किया जाता है:

if (&param == this) // do something 

यहाँ मुश्किल हिस्सा है। param टाइप प्रकार की एक वस्तु है, लेकिन &param परम का स्मृति पता है। इसलिए परम के स्मृति पते को "this" नामक किसी अन्य स्मृति पते के विरुद्ध परीक्षण किया जाता है। यदि आप ऑब्जेक्ट के मेमोरी एड्रेस को कॉपी करते हैं तो इस विधि को इस विधि के तर्क में बुलाया जाता है, इसके परिणामस्वरूप true होगा।

मूल्यांकन इस प्रकार का आमतौर पर जब प्रतिलिपि निर्माता

MyClass& MyClass::operator=(const MyClass &other) { 
    // if a programmer tries to copy the same object into itself, protect 
    // from this behavior via this route 
    if (&other == this) return *this; 
    else { 
     // otherwise truly copy other into this 
    } 
} 

अधिक भार से किया जाता है इसके अलावा *this, जहां this किया जा रहा है के उपयोग पर ध्यान दें dereferenced। यही है, स्मृति पता लौटने की बजाय, उस स्मृति पते पर स्थित ऑब्जेक्ट को वापस करें।

+1

वास्तव में अच्छा ब्रेक डाउन, मेरा धन्यवाद। – tetris11

37

& अधिक एक अर्थ है एक संदर्भ चर घोषित करें

int k = 0; 
int& r = k; 
//r is a reference to k 
r = 3; 
assert(k == 3); 

4) बिटवाइज़ और ऑपरेटर

int a = 3 & 1; // a = 1 

एन) दूसरों ???

+4

और बिट-वार * और * –

+1

प्रश्न विशिष्ट है। क्यू में कोड में इसका क्या अर्थ है? –

+1

मेरे पास डाउनवॉट्स के खिलाफ कुछ भी नहीं है, लेकिन मैं जानना चाहता हूं कि क्यों मैं कुछ सीख सकता हूं। –

1

अच्छी तरह से CDummy& param फ़ंक्शन CDummy::isitme के पैरामीटर के रूप में घोषित किया गया है वास्तव में reference है जो एक सूचक की तरह "अलग" है, लेकिन अलग है। संदर्भों के बारे में ध्यान देने योग्य महत्वपूर्ण बात यह है कि उन कार्यों के अंदर जहां उन्हें पैरामीटर के रूप में पारित किया जाता है, आप वास्तव में इस प्रकार के उदाहरण का संदर्भ रखते हैं, न कि सिर्फ "पॉइंटर"। तो, टिप्पणी के साथ लाइन पर, '&' सी की तरह काम कर रहा है, इसे पारित तर्क का पता मिल रहा है, और इसे this से तुलना कर रहा है, बेशक, कक्षा के उदाहरण के लिए एक सूचक विधि को बुलाया जा रहा है।

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