2011-01-24 13 views
5

पर: http://www.horstmann.com/ccj2/ccjapp3.html, ए 3.4 के तहत। ऑब्जेक्ट्स, का उल्लेख निम्नलिखित:सी ++ होल्ड मानों में ऑब्जेक्ट वेरिएबल, संदर्भ संदर्भ नहीं

C++ में, वस्तु चर मान हो, संदर्भ आपत्ति नहीं

आप इस बात को स्पष्ट कर सकते हैं? और, क्या यह केवल C12+ में pointer है जिसमें ऑब्जेक्ट संदर्भ हैं?

क्या हम यहां कह सकते हैं कि object referenceobject address है?

धन्यवाद।

उत्तर

3

सी ++ मूल्य/सूचक/संदर्भ की अवधारणाओं का समर्थन करता है। एक मान जावा int जैसा है यदि आप इसे किसी फ़ंक्शन में पास करते हैं जो तर्क को संशोधित करता है, मूल मान अपरिवर्तित है, इसे मान अर्थशास्त्र के रूप में जाना जाता है।

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

अधिक जानकारी के लिए Reference and value semantics देखें।

1

एक ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट का स्थायी, निश्चित और निहित पता है। जबकि एक सूचक एक परिवर्तनीय, स्पष्ट पता चर है। दूसरे शब्दों में, ऑब्जेक्ट तक पहुंचने के लिए एक संदर्भ किसी ऑब्जेक्ट के पते का उपयोग करता है, लेकिन 1) यह प्रोग्रामर को यह पता उपलब्ध नहीं करता है, और 2) संदर्भ किसी विशेष ऑब्जेक्ट को स्थायी रूप से बाध्य किया जाता है। एक सूचक किसी विशेष प्रकार के किसी ऑब्जेक्ट को इंगित कर सकता है, या बिल्कुल कोई ऑब्जेक्ट नहीं। प्रारंभ अनिवार्य नहीं है। इसके अलावा, चूंकि एक सूचक एक चर है, इसे इच्छानुसार फिर से सौंप दिया जा सकता है।

4

क्या आप इस बिंदु को स्पष्ट कर सकते हैं?

उदाहरण के साथ तुलना करके समझना सर्वोत्तम है। जावा या सी #:

MyClass a = new MyClass; // creates an instance. 
MyClass b = a; // we still have one instance of MyClass in memory 

इसके विपरीत C++:

MyClass a; // a *is* an instance of MyClass. 
MyClass b = a; // we make a copy of a, now there are *two* instances of MyClass. 

और, यह C++ उस वस्तु के संदर्भ रखती केवल सूचक है?

नहीं, संदर्भ भी।

क्या हम यहां कह सकते हैं कि ऑब्जेक्ट संदर्भ ऑब्जेक्ट पता है?

नहीं, यदि आपका मतलब A& संदर्भ है, तो यह एक कार्यान्वयन विवरण है। इसके अलावा आप संदर्भ अर्थशास्त्र वाले ऑब्जेक्ट्स को कार्यान्वित कर सकते हैं जो सी # में काम करते हैं।

xml_node root = ...; 
xml_node root2 = root; // doesn't copy the document 
// root2 refers to the same object as root. 
1

हाँ, सी ++ संकेत में, वस्तु संदर्भ पकड़ & ऑपरेटर है कि एक implit संदर्भ भी कर वहाँ है: pugixml पुस्तकालय में xml_node एक उदाहरण है। जावा और सी ++ के अलग-अलग व्यवहार हैं।

myobject a; 
a = new myobject(); 

C++ में: जावा में

myobject a; 

या MyObject * एक; ए = नया myobject();

1

सी ++ में डिफ़ॉल्ट रूप से मूल्यों को ऑब्जेक्ट पास करना और स्टोर करना है। तो यदि आपके पास

class A { 
    int x[5000]; 
} 

यह 5000 इनट्स स्टोर करता है जो एक प्रकार बनाता है। यदि आपके पास एक वर्ग है जो ए का उपयोग करता है:

class B { 
    A content; 
}; 

तो प्रत्येक बी में इसमें 5000 इन्स की सरणी है।

class C { 
    A* content; 
}; 

या एक

के लिए एक संदर्भ: यह जावा, जहां सामग्री ए

के लिए सूचक की तरह कुछ होगा C++ में आप सामग्री एक करने के लिए एक सूचक बनाने के लिए विकल्प होता है की तरह एक भाषा के विपरीत

class D { 
    A& content; 
}; 

लेकिन आपको स्पष्ट रूप से ऐसा करना होगा। साथ ही, सी ++ में संदर्भ शून्य नहीं हो सकते हैं, इसलिए यदि कोई संभावना है कि सामग्री का मान अपरिभाषित है, तो आपको एक पॉइंटर का उपयोग करना होगा।

1

वास्तव में सी ++ में तीन अलग-अलग प्रकार के चर हैं। मान, संदर्भ और पॉइंटर्स। क्या पहले एक, मूल्य, इसका मतलब है इसका मतलब है कि अगर आप

int a; 

या

SomeOtherType a; 

को परिभाषित करने और है कि आप उस प्रकार के नई वस्तु बनाने और स्मृति संग्रहीत करने के लिए सुरक्षित हो जाता है। और फिर आप उदाहरण के लिए इसकी सामग्री अन्य चर को

another_variable = a; 

लिख आप के बजाय संकेत का उपयोग करते हैं, इस तरह से कॉपी कर सकते हैं:

SomeType *a = &some_existing_variable; 

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

2

यह थोड़ा अधिक विस्तार हो सकता है, लेकिन, सटीक होने के लिए, एक सूचक एक ऑब्जेक्ट वेरिएबल होता है जो किसी अन्य ऑब्जेक्ट का पता संग्रहीत करता है और इसकी एक इकाई होती है: आप एक पॉइंटर के पते का अनुरोध कर सकते हैं, आप कर सकते हैं एक सूचक संशोधित करें ...

संदर्भ (सी ++ भावना, नहीं जावा) चर आपत्ति नहीं कर रहे हैं (वर्तमान मानक में, मेरा मानना ​​है कि कुछ rewording इस के आसपास C++ 0x में जा रहा है), बल्कि उपनाम वस्तुओं के लिए। इसके आस-पास कुछ तकनीकी विवरण हैं, उदाहरण के लिए तथ्य यह है कि आप वस्तुओं के सरणी बना सकते हैं, लेकिन आप संदर्भों के सरणी नहीं बना सकते हैं (संदर्भ वस्तुएं नहीं हैं)।

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

template <typename T> 
void swap(T & lhs, T & rhs) 
{ 
    T tmp = lhs; 
    lhs = rhs; 
    rhs = tmp; 
} 
int main() { 
    int a = 1, b = 5; 
    swap(a, b);  // a == 5, b == 1 after this call in this context 
} 

यदि आप मन में है कि रखने के लिए और आप समझते हैं कि जावा संदर्भ में मूल्य (संदर्भ की एक प्रति से पारित कर रहे हैं समारोह में पारित किया जाता है) तो आपने सी ++ फ़ंक्शन कॉल सेमेन्टिक्स को समझने में एक अच्छा कदम उठाया है।

0

ऑब्जेक्ट वेरिएबल्स और पॉइंटर चर के बीच अंतर को समझने के सबसे दृश्य तरीकों में से एक उस स्थान के साथ करता है जहां स्मृति आवंटित की जाती है: ऑब्जेक्ट वेरिएबल्स स्टैक ऑब्जेक्ट्स का संदर्भ लेते हैं, जबकि पॉइंटर्स (और संदर्भ) संदर्भित (आमतौर पर) ढेर वस्तुओं। दोनों अलग-अलग बनाए जाते हैं, अलग-अलग जीवन काल होते हैं, और प्रत्येक के अपने फायदे और नुकसान होते हैं।

बाहर की जाँच करें मेरे लेख के "ढेर और ढेर" अनुभाग: http://akos.ma/188y

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