2010-01-08 3 views
5

Vor kurzem sah ich den Code unten (vereinfachte Version weiter unten) in meiner Code-Basis und bekam diesen Zweifel:Kann Zeiger auf Referenz und Zeiger auf die aktuelle Variable gleich behandelt werden?

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. Den Zeiger zu verweisen und Zeiger auf tatsächliche Variable kann als gleich behandelt werden?
  2. Der Standard sagt etwas über die Adresse der Referenz aus, die für die Adresse der Variablen verwendet werden kann.

Antwort

2

Ja, es ist nicht möglich, die Adresse einer Referenz zu nehmen. Sie erhalten immer die Adresse des referenzierten Objekts.

2

Ja, es ist gleichwertig. Die Adresse einer Referenz nimmt die Adresse der ursprünglichen Sache zurück. Da es keine Möglichkeit gibt, eine andere Adresse aus einer Referenz zu entfernen, gibt es keinen separaten Typ für einen Zeiger auf eine Referenz.

9

Der erste Satz von Standard 8.3.2/4:

Es dürfen keine Hinweise auf Referenzen, keine Anordnungen von Referenzen, und keine Hinweise auf Referenzen

(My Hervorhebung)

Das bedeutet nicht, dass Sie nicht die Adresse einer als Referenz deklarierten Variablen nehmen können, es bedeutet nur, dass es keine separate gibt Geben Sie einen Zeiger auf eine Referenz ein.

+0

Ich bin froh, dass Sie das geklärt haben. ;-) –

+0

Hmmm ... Ich bin immer noch mit der Linie vom Standard verwirrt. Ich interpretierte diese Zeile vom Standard als ---- wir sollten nicht versuchen, Hinweise zu nehmen. bedeutet, Adresse der Referenz darf nicht verwendet werden. –

+0

@aJ Nein, es bedeutet nur, dass Sie Typen vom Typ 'B & *' nicht deklarieren können. –