2016-04-11 23 views
-1

Betrachten Sie den folgenden Code ein:Auf welche Adresse zeigt "& ref_var"?

std::vector &MyClass::getVector() const 
{ 
    return (myVec); 
} 

void aFunc() 
{ 
    std::vector *vec = &myClassInstance.getVector(); 
} 

Welche Adresse hat vec Punkte? Zeigt es auf die Adresse von myVec im Objekt myClassInstance? (Ich weiß, ich sollte einen const ref zurückgeben, aber es ist ein Beispiel).

+6

Warum probieren Sie es nicht aus? – user463035818

Antwort

3

Sie geben eine Referenz auf myVec in der Methode getVector zurück. Wenn Sie die Adresse einer Referenz nehmen, erhalten Sie die Adresse der Variablen, auf die sich die Referenz bezieht. So wird vec die Adresse myVec enthalten.

+0

Ich war mir über dieses Verhalten nicht sicher. Danke (Tobi303 vorgeschlagen, ich habe es versucht, und ich bestätige deine Antwort) – Krapow

2

Eine Referenz ist ein Alias ​​für eine andere Variable. Wenn Sie einen Verweis auf myVec von getVector() zurückgeben, dann können Sie erwägen, die Funktion genau wie Zugriff auf myVec aufzurufen, wenn sie öffentlich verfügbar wäre.

&MyClass.myVec == &myClassInstance.getVector() 

Welche Adresse hat vec Punkte?

Die Adresse myClassInstance.getVector() ist identisch mit der Adresse myVec.

Beachten Sie auch, dass Sie da eine lvalue Referenz kehren Sie es sogar auf der linken Seite einer Zuweisung wie

myClassInstance.getVector() = some_other_vector; 

Und jetzt myVec wird eine Kopie von some_other_vector verwenden können.

0

Ja, es zeigt auf den Vektor myVec in Ihrer MyClass-Instanz. Siehe den folgenden Beispielcode:

#include <cstdio> 
#include <vector> 

class MyClass { 
    std::vector<int> myVec; 

public: 
    MyClass() {} 
    ~MyClass() {} 

    std::vector<int>& getVector() 
    { 
     return myVec; 
    } 

    void printVector() const 
    { 
     for(std::vector<int>::const_iterator it = myVec.begin(); it != myVec.end(); ++it) 
     { 
      printf("%d ", *it); 
     } 
     printf("\n"); 
    } 
}; 

int main(int, char**) 
{ 
    MyClass item; 

    std::vector<int>* vec = &(item.getVector()); 

    vec->push_back(1); 
    item.printVector(); 

    return 0; 
} 

Ausführen dieses Programm folgende Ausgabe:

$ ./a.out 
1 

So können Sie sehen, dass Aufruf getVector() gibt einen Verweis auf myVec aus dem MyClass Beispiel, da wir ein neues Element hinzuzufügen Der Vektor (vec->push_back(1)) über den Zeiger vec druckt dann den Vektor der MyClass-Instanz, und es zeigt, dass der Artikel, den wir hinzugefügt haben, dort in myVec ist.

Verwandte Themen