2016-07-20 4 views
-1

deklarieren Ich habe Referenzvariablen Konzepte durchlaufen und festgestellt, dass Membervariablen einer Klasse als Referenz deklariert werden müssen im Konstruktor mit Initialisierer initialisiert werden Liste. aber im folgenden Code deklariere ich einen Zeiger auf die Klasse und weise später den Referenzvariablen den Wert zu. Kann mir jemand erklären, was im Hintergrund passiert? warum gibt es keinen Fehler, da ich die Bezugsvariablen der Mitglieder nicht initialisiere.Was geschieht im Hintergrund, wenn wir einen Zeiger auf ein Objekt einer Klasse mit Membervariable als Referenz

#include <iostream> 
using namespace std; 

class A 
{ 
    public: 
     int &a; 
     int &b; 
     A(int &a, int &b):a(a),b(b){} 
}; 

int main(){ 
    A *p; 
    p->a = 100; 
    p->b = 200; 
    cout<<"a:"<<p->a<< "b:"<<p->b<<endl; 
    return 0; 

}

+4

undefiniertes Verhalten. Sie referenzieren einen nicht initialisierten Zeiger. – juanchopanza

+3

Sie konstruieren nie ein 'A' Objekt. – alain

+1

Nur weil du scheinbar etwas tun kannst, heißt das nicht, dass du ** sollte **. "Warum gibt es keinen Fehler?" Ich weiß nicht, welchen Compiler Sie verwenden, sondern aktivieren Warnungen, wie Sie es immer tun sollten, z. g ++: 'main.cpp: 14: 8: Warnung: 'p' wird in dieser Funktion nicht initialisiert verwendet [-Wuninitialized]' –

Antwort

1

Sie einen Verweis initialisieren kann nur einmal. Das ist nicht anders, ob es sich um ein Mitglied einer Klasse ist oder nicht:

int a; 
int& b = a; // <- initialize the reference 
int& c;  // NOT OK, references have to be initialized to reference something 

Eine spätere Zuordnung nicht die Variable ändert sich die Referenz verweist, aber es ändert sich der Wert dieser Variablen:

int c = 3; 
b = c;  // now a==3 but b is still a reference to a 

Bitte beachten Sie, dass Ihr Code einige schwerwiegende Probleme hat, die nicht mit Ihrer Frage in Zusammenhang stehen. Es ist bereits in Kommentaren erwähnt, aber der Vollständigkeit halber: Sie erstellen niemals ein Objekt und dereferenzieren Sie einen ungültigen Zeiger, der zu undefiniertem Verhalten führt.

PS: Ich habe die Frage erneut gelesen und festgestellt, dass die Probleme in Ihrem Code tatsächlich auf die Frage bezogen sind.

Was geschieht im Hintergrund, wenn wir einen Zeiger auf ein Objekt einer Klasse deklarieren, die eine Mitgliedsvariable als Referenz hat?

Die Antwort darauf ist eher einfach und kurz: Nichts passiert im Hintergrund. Wenn Sie einen Zeiger deklarieren, haben Sie gerade einen Zeiger deklariert. Ein deklarierter Zeiger bezieht sich auf die Erstellung eines Objekts mit einem Stück Papier, auf dem Sie die Adresse eines Hauses schreiben können, um ein Haus zu bauen. Aber wenn Sie nur einen Zeiger deklarieren, kennen Sie weder die Adresse, noch haben Sie das Haus gebaut. Wie auch immer

, wenn ich auf dem Code aussehen kann ich vorschlagen, dass Sie nur weg von den dynamischen Zuordnung zu bleiben und stattdessen einfach tun:

int main(){ 
    int a,b; 
    A p = A(a,b); 
    p.a = 100; 
    p.b = 200; 
    cout<<"a:"<<a<< "b:"<<b<<endl; 
    return 0; 
} 
Verwandte Themen