2016-06-06 9 views
-1
Beteiligung

Das ist also der ursprüngliche Code:diesen Code zu verstehen Zeiger, Arrays und die neuen Betreiber

class IntegerArray { 
public: 
    int *data; 
    int size; 
}; 
int main() { 
    IntegerArray arr; 
    arr.size = 2; 
    arr.data = new int[arr.size]; 
    arr.data[0] = 4; arr.data[1] = 5; 
    delete[] a.data; 
} 

Nach arr.data = new int[arr.size] zu einem Konstruktor zu bewegen, wird es

class IntegerArray { 
public: 
    int *data; 
    int size; 
    IntegerArray(int size) {  
     data = new int[size];  
     this->size = size; 
     } 
    }; 
int main() { 
    IntegerArray arr(2); 
    arr.data[0] = 4; arr.data[1] = 5;  
    delete[] arr.data; 
} 

ich ziemlich bin verloren was der Code versucht zu tun. Für

IntegerArray(int size) {  
    data = new int[size];  
    this->size = size; 
    } 

Ist die int-Größe genau so groß wie die int-Größe, die in der Klasse IntegerArray deklariert wurde?

Gibt data = new int[size] nur uns sagen, dass Daten auf die Ausgabe des Arrays bei int-Größe zeigt, mit neuen Worten, dass die Größe des Arrays variabel ist?

Ist this-> size = size nur ein Zeiger, der uns sagt, dass der Größenwert des Konstruktors nur gleich dem Größenparameter der Klasse ist?

Warum werden arr.data[0] und arr.data[1] sogar nach IntegerArray arr (2) erwähnt? Sie scheinen dem Konstrukteur nicht zu folgen, aber ich bin wahrscheinlich einfach zu müde, um diesen Teil zu verstehen.

+0

Warum "neu" und "löschen" verwenden? Das ist 2016! –

+0

Oh, ist meine Lesequelle zu alt? Ich gehe von MITs Folien für ihre C++ - Klasse. Ich dachte arr [] bedeutete, das Ergebnis für jede Zahl vom Anfang des Arrays zurückzugeben, also werde ich von data = new int [size] abgeworfen. – AttemptingTo

+0

Sie liegen nicht falsch, aber das ist eine Art unsichere, verwirrende und fehleranfällige Art, Arrays in C++ zu erstellen! Du hättest das Problem nicht, wenn du Tools wie 'std :: vector' benutzt hättest (was seit 1998 existiert und schon seit Jahren Standard ist!). Dies beantwortet deine Frage allerdings nicht. –

Antwort

2
IntegerArray(int size) {  
    data = new int[size];  
    this->size = size; 
} 

int size ist genau das gleiche wie ...

Diese int size:

IntegerArray(int size) { 
      ^^^^^^^^ 

ist ein Argument der Konstruktor

D oes data = new int[size] nur uns sagen ...

new int[size] weist dynamisch ein Array, das size Anzahl von int Objekte enthält. data Zeiger wird dann zugewiesen, um auf das neu erstellte Array zu zeigen.

Ist this-> size = size nur ein Zeiger ...

Nr this ist ein spezieller Zeiger, dass innerhalb der Konstruktor verweist auf das Objekt, das gebaut wird.this->size ist die Membervariable, die hier erklärt wurde:

class IntegerArray { 
public: 
    int *data; 
    int size; 
    ^^^^^^^^ 

Der komplette Ausdruck this->size = size weist den Wert size, dass das Konstruktor Argument ist, an die Membervariable size.

Warum sind arr.data[0] und arr.data[1] auch nach IntegerArray arr(2) erwähnt?

Der Konstruktor initialisiert nicht den Inhalt des Arrays (die Integer-Objekte innerhalb des Arrays). Der erwähnte Code weist ihnen Werte zu.

+0

Nun, nein, der erwähnte Code "initialisiert" nichts; es weist nur zu. –

+0

Man könnte hinzufügen, dass es ein schlechter Stil ist, um Argumente für Elementfunktionen (hier: 'size') den Mitgliedern dieser Klasse zu benennen. Die Verwirrung des OP ist nicht überraschend. Es gibt einige Namenskonventionen (obwohl afaics keine Übereinstimmung in der C++ - Community gibt), um Folgendes zu verhindern: Öffentliche Member mit Anfangsbuchstaben für Großbuchstaben benennen, nicht öffentliche Member mit einem Anfangsunterstrich benennen oder Argumente mit dem Suffix "Arg" benennen . All dies würde natürlich die Benennung von Duplikaten vermeiden. –

+0

@LightnessRacesinOrbit behoben. – user2079303

1
this->size = size //the fist size is your member variable which is inside IntegerArray. the 2nd size is the size you give over to the Method 
data = new int[size]; // here you are creating a new array with the size of "size" 

die Methode Integer (int size) ist ein Konstruktor, man kann es nur einmal aufrufen pro Objekt (auch in der Zeit, wenn Sie das Objekt erstellen) arr

int main() //the startpoint of your program 
{ 
    IntegerArray arr(2); //you are creating a new object with a size of 2 
    arr.data[0] = 4; arr.data[1] = 5; //because of your array is public, you can call it direct from outside (you sould define it as private ore protected). arr.data[0] is the first item of the array, arr.data[1] is the 2nd item 
    delete[] arr.data; 
} 

löschen []. Daten; sollte innerhalb der destructor Ihrer Klasse sein ...

+0

Sie können niemals selbst einen Konstruktor "aufrufen". Und wenn Sie vorschlagen, 'delete []' in den Destruktor zu setzen, müssen Sie _must_ auch vorschlagen, eine tiefe Kopie in den Kopierkonstruktor und den Zuweisungsoperator zu legen. –

+0

@LightnessRacesinOrbit Da die Klasse steht, ist sie trotzdem kaputt (Zuweisung leckt), also können wir annehmen, dass man diese Arrays nicht zuweisen oder kopieren sollte. (Ich gehe davon aus, dass die Korrektur die Lektion der nächsten Woche sein wird.) –

+0

@Peter: Dann sollten wir das in der Antwort angeben, anstatt gefährlich kaputten Code jemandem anzubieten, der es nicht besser weiß! Anstatt es einem anderen zu überlassen, um sie vielleicht irgendwann in der Zukunft darüber zu informieren. –