2010-01-08 12 views
5

मैं हाल ही में नीचे दिए गए कोड (सरलीकृत नीचे दिए गए संस्करण) मेरी कोड बेस में देखा था और इस संदेह हो गया है:वास्तविक चर के संदर्भ में पॉइंटर संदर्भ और पॉइंटर के समान व्यवहार किया जा सकता है?

class B; 
class A 
{ 
    public: 
    A():m_A("testA"){} 
    B& getB() 
    { 
     return m_B; 
    } 
    B* getBPtr() //== > written to explain the problem clearly 
    { 
     return &m_B; 
    } 
private: 
    B m_B; 
}; 

class B 
{ 
    public: 
    B(const std::string& name):m_Name(name){} 
    std::string getName() const 
    { 
     return m_Name; 
    } 
private: 
    std::string m_Name; 
}; 

class C 
{ 
public: 
    void testFunc(B* ptr) 
    { 
    } 
}; 


int main() 
{ 
    A a; 
    C c; 
c.testFunc(&a.getB()); ===> is it equivalent to c.testFunc(a.getBPtr()) ? 
} 
  1. सूचक संदर्भ के लिए और वास्तविक चर सूचक एक ही माना जा सकता है?
  2. क्या मानक संदर्भ के पते पर वैरिएबल के पते के लिए उपयोग किए जाने वाले विनिमेय होने के संदर्भ में कुछ भी कहता है।

उत्तर

2

हां, किसी संदर्भ का पता लेना संभव नहीं है। आपको हमेशा निर्दिष्ट वस्तु का पता मिलता है।

2

हां यह बराबर है। किसी संदर्भ का पता लेना मूल चीज़ का पता देता है। चूंकि किसी संदर्भ से कोई अन्य पता प्राप्त करने का कोई तरीका नहीं है, किसी संदर्भ के लिए पॉइंटर के लिए कोई अलग प्रकार नहीं है।

9

मानक 8.3.2/4 के प्रथम वाक्य:

वहाँ संदर्भ का कोई सन्दर्भ, संदर्भ, का कोई सरणियों और संदर्भ

करने के लिए कोई संकेत होगा (मेरे जोर)

इसका मतलब यह नहीं है कि आप एक संदर्भ के रूप में घोषित एक चर का पता नहीं ले सकते हैं, इसका मतलब है कि कोई अलग नहीं है एक संदर्भ के लिए एक सूचक के लिए टाइप करें।

+0

मुझे खुशी है कि आपने इसे स्पष्ट किया है। ;-) –

+0

हमम ... मैं अभी भी मानक से लाइन के साथ उलझन में हूँ। मैं मानक से उस रेखा को व्याख्या कर रहा था ---- हमें संदर्भ में पॉइंटर्स लेने की कोशिश नहीं करनी चाहिए। मतलब, संदर्भ का पता इस्तेमाल नहीं किया जाना चाहिए। –

+0

@ एजे नहीं, इसका मतलब है कि आप 'बी & *' प्रकार के प्रकार घोषित नहीं कर सकते हैं। –

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