Statische Variablen

Wanderfalke

Wanderfalke

Aktives Mitglied
Thread Starter
Dabei seit
28.12.2007
Beiträge
616
Reaktionspunkte
5
hey,
ich habe hier dieses Programmbeispiel und ich verstehe die Ausgabe dabei nicht:

Code:
#include <iostream>
using namespace std;

class Statisch {
	private:
		int mWert;
		static int lfd_nr;
	public:
		Statisch () {lfd_nr++; mWert=lfd_nr;}
		void leseWert(void);
};

void Statisch::leseWert(void) {
	cout << "\nWert von lfd_nr. " << lfd_nr;
	cout << " lfd_nr bei Erzeugung des Objekts: " << mWert;
}

int Statisch::lfd_nr=0;

int main() {
	Statisch a;
	a.leseWert();
	Statisch b;
	a.leseWert();
	b.leseWert();
	Statisch c;
	a.leseWert();
	b.leseWert();
	c.leseWert();
	cout << endl << endl;
	
	return 0;
}

die Ausgabe lautet folgendermaßen:
Code:
Wert von lfd_nr. 1 lfd_nr bei Erzeugung des Objekts: 1
Wert von lfd_nr. 2 lfd_nr bei Erzeugung des Objekts: 1
Wert von lfd_nr. 2 lfd_nr bei Erzeugung des Objekts: 2
Wert von lfd_nr. 3 lfd_nr bei Erzeugung des Objekts: 1
Wert von lfd_nr. 3 lfd_nr bei Erzeugung des Objekts: 2
Wert von lfd_nr. 3 lfd_nr bei Erzeugung des Objekts: 3

Dabei verstehe ich nicht, wieso z.B. bei der zweiten Ausgabe nicht auch 2 steht. schließlich wurde unter "public" doch "mWert=lfd_nr" gesetzt. Warum ist die dann nicht gleich?

Könnt ihr mir dabei helfen?
 
was verstehst du nicht?
int Statisch::lfd_nr=0;
überlädt die lfd_nr mit 0, so dass es beim ersten instanziieren auf 0 steht und vom constructor hochgezählt wird...
 
ich verstehe nicht, warum mWert nicht mithochgezählt wird.
Im Konstruktor steht, dass mWert=lfd_nr - also müsste mWert doch immer genau denselben Wert haben, wie lfd-nr - aber den hat es ja offensichtlich nicht.
Das verstehe ich im moment überhaupt nicht :kopfkratz:
 
es wird doch nur im constructor gesetzt, d.h. aufgerufen bei
Statisch a;
usw...
 
hmmm ich glaub wir reden aneinander vorbei, oder ich kapiers nicht

wenn ich ein neues Objekt erzeuge, wird doch der Konstruktor aufgerufen. Der Konstruktor zählt einmal lfd_nr um 1 hoch - und setzt mWert = lfd_nr. Und das macht er ja irgendwie nicht. er setzt mWert nicht gleich lfd_nr.
Jedenfalls ist bei der zweiten Ausgabe mWert ja immer noch 1 und nicht 2
....??
 
wie oft rufst du denn den constructor auf?
und wie oft liest du den wert aus?
beachte mal die reihenfolge...
 
ich rufe den konstruktor 3x auf, und lese die werte 6x aus, oder nicht?

aber ich verstehe einfach nicht, wieso mWert nicht gleich lfd_nr sein kann. mWert wird doch nur da oben beim Konstruktor beschrieben - sonst taucht das doch nicht auf...

Kannst du vielleicht mal ein bisschen ausführlicher erläutern, wie das Programm abläuft?
 
In Deinem Programm gibt es genau eine Variable lfd_nr, aber drei Variablen mWert, nämlich a.mWert, b.mWert und c.mWert.

a.mWert bleibt unverändert, wenn lfd_nr oder b.mWert sich ändern. Es wird einmalig auf den *Wert* von lfd_nr gesetzt, ist aber danach von lfd_nr völlig unabhängig. Da es nicht statisch ist, hat jede Instanz des Objekts (a, b, c) ihre eigene Variable mWert.

EDIT: Betrachte z.B. folgendes Programm:

x=1;
y=x;
x=2;

Danach hat y den Wert 1 und x den Wert 2.
 
Statisch a; --> lfd_Nr++ --> 1, a.mWert == 1
a.leseWert(); Ausgabe 1(lfd_nr) 1 (a.Wert)

Statisch b; --> lfd_Nr++ --> 2, b.mWert == 2
a.leseWert(); Ausgabe 2(lfdNr) 1(a.mWert)
b.leseWert(); Ausgabe 2(lfdNr) 2(b.mWert)

Statisch c; --> lfd_Nr++ --> 3, c.mWert == 3
a.leseWert(); Ausgabe 3(lfdNr) 1(a.mWert)
b.leseWert(); Ausgabe 3(lfdNr) 2(b.mWert)
c.leseWert(); Ausgabe 3(lfdNr) 3(c.mWert)

Das Programm arbeitet genau so, wie du es hingeschrieben hast :)
 
ah vielen Dank!!
nu hab ichs verstanden :dance2:
Danke euch!

Schönen Abend noch :)
 
Zurück
Oben Unten