2010-01-08 9 views
5

Geçenlerde benim kod tabanı aşağıdaki kodu (aşağıda verilen basitleştirilmiş versiyonu) gördüm ve bu şüphe var:Referans gösterebilir ve gerçek değişkenin İşaretçisi aynı şekilde ele alınabilir mi?

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. aynı şekilde tedavi edilebilir gerçek değişkene referans işaretçi ve işaretçi?
  2. Standart, referans adresinde, değişkenin adresi için değiştirilebilir olarak kullanılan herhangi bir şey ifade ediyor mu?

cevap

2

Evet, referansın adresini almak mümkün değil. Her zaman söz konusu nesnenin adresini alırsınız.

2

Evet, buna eşdeğerdir. Bir referansın adresini almak, orijinal şeyin adresini döndürür. Referans dışında başka bir adres almanın bir yolu olmadığından, referans için bir işaretçi için ayrı bir tür yoktur. Standart 8.3.2/4

9

İlk cümle:

referanslar

için referanslar hiçbir referanslar, referanslar, hiçbir diziler ve hiçbir işaretçiler bulunmayacaktır (Benim vurgusu)

Bu, referans olarak bildirilen bir değişkenin adresini alamayacağınız anlamına gelmez, sadece ayrı bir şey olmadığı anlamına gelir. referansa bir işaretçi yazın.

+0

Bunu açıkladığınıza sevindim. ;-) –

+0

Hmmm ... Hala standart hat ile karıştırıldım. Bu çizgiyi standarttan ---- olarak yorumluyordum, referans almak için işaretçiler almaya çalışmamalıyız. anlamına gelir, referans adresi kullanılmamalıdır. –

+0

@aJ Hayır, yalnızca B & * 'türlerini bildiremediğiniz anlamına gelir. –

İlgili konular