Einige Fragen zu Referenzen
-
Hallo,
Ich habe einige Fragen zu Referenzen und hoffe jemand kann mir diese beantworten

In Bezug auf getter-Methoden mal ein Beispiel:
Ich habe eine"Info" Klasse die ein ein Objekt der Klasse State besitzt, welches abgefragt werden kann;class State; class Info { ... const State& getState1() { return m_state; } State getState2() { return m_state; } ... private: State m_state; }; ... int main() { ... State state1 = rInfo.getState1(); // state1 wird erzeugt und der Zuweisungsoperator von State ausgeführt (?), ich kann state1 auch verändern State& state2 = rInfo.getState1(); // error weil nicht const const State& state3 = rInfo.getState1() // es wird kein Objekt erzeugt, ich kann state3 nicht verändern State state4 = rInfo.getState2(); // genau gleich wie bei state1? State& state5 = rInfo.getState2(); // ? ... }Ich habe leder nirgends Infos dazu gefunden (wusste auch nicht wie danach suchen)...
Danke für jede Antwort!
-
Hier Lektion 36 und 37 behandelt referenzen.
-
Hallo,
dabei geht es aber nur um Referenzen als Argumente (Call by Reference) und nie um Referenzen als Rückgabewert, also meine konkreten Fragen kann ich damit nicht beantworten.
-
OK, naja das ist im Grunde alles Ähnlich, das Referenzbeispiel erklärt genau was du meinst, abe rich schreib dir mal Kommentare.
State state1 = rInfo.getState1(); // das ist eine Kopie vom zurückgegebenen m_state State& state2 = rInfo.getState1(); // das ist eine Referenz auf das Original m_state, mit dieser Referenz könntest du m_state verädnern, da die zuweisung aber const ist geht das nicht const State& state3 = rInfo.getState1() //da weis ich nicht 100%ig bescheid State state4 = rInfo.getState2(); // wieder eine Kopie von m_state State& state5 = rInfo.getState2(); // eine referenz auf m_state über die du m_state direkt manipulieren kannst
-
Danke nochmals für deinen Beitrag
const State& state3 = rInfo.getState1() //da weis ich nicht 100%ig bescheidNa ich denke dies ist doch der Normalfall für ein getter-Methode wenn ich nur lesend darauf zugreifen möchte (das Objekt der Info-Klasse kann nicht verändert werden und es muss kein temporäres Objekt zusätzlich erzeugt werden)
State& state5 = rInfo.getState2(); // eine referenz auf m_state über die du m_state direkt manipulieren kannstDann ist die Variante getState2() für eine getter-Methode also falsch, da der Benutzer der Info Klasse nun den Zustand des Info-Objekts manipulieren kann (was ja nicht der Sinn der Sache ist, es ist ja eben keine set-Methode)
-
Xebov schrieb:
OK, naja das ist im Grunde alles Ähnlich, das Referenzbeispiel erklärt genau was du meinst, abe rich schreib dir mal Kommentare.
Zum Teil leider falsche Kommentare, ich korrigier mal:
State state1 = rInfo.getState1(); /* state1 ist ein neues State-Objekt und wird mit der Referenz auf m_state initialisiert, das ist ok genau dann wenn State einen Copy-Ctor hat (wenn der nicht grade eine non-const referenz als argument hat), z.B. vom compiler generierter copy-ctor */ State& state2 = rInfo.getState1(); /* wie vom OP bemerkt ein Fehler, eine nicht-konstante referenz kann nicht an eine const referenz gebunden werden */ const State& state3 = rInfo.getState1() /* state3 verweist auf m_state, const ref an const ref zu binden ist das was am offensichtlichsten funktioniert */ State state4 = rInfo.getState2(); /* wieder eine Kopie von m_state, im Grunde sogar eine Kopie von der Kopie: getState2 liefert eine Kopie, state4 wird mittels copy-Ctor mit dieser Kopie initialisiert. die 2te Kopie wird vom Compiler meist wegoptimiert */ State& state5 = rInfo.getState2(); /* die referenz state5 wird an das temporäre Objekt gebunden, das von getState2 übergeben wird, FEHLER! */ const State& state6 = rInfo.getState2(); /* die konstante referenz state6 wird an das temporäre Objekt gebunden, das von getState2 übergeben wird, das ist KEIN Fehler: const-referenzen auf temporäre Objekte halten diese am Leben, bis die Referenz verschwindet, siehe http://herbsutter.wordpress.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ */
-
Vielen Dank pumuckl, das hilft mir sehr!
