Frage zu Klassenerstellung
-
Hallo zusammen,
ich habe ein Frage zur Erstellung von Klassen:
Warum kann ich denn ein Attribut nicht standardmäßig in der Klasse definieren, sondern muss das im Konstruktor machen:
#include <cstdlib> #include <iostream> using namespace std; class Testen { private: int zahl1, zahl2; //warum funktioniert das nicht?????? //zahl2 = 6; public: Testen() { zahl2 =6; } int rechnen (int z1) { return z1*zahl2; } }; int main(int argc, char *argv[]) { Testen test1; cout << test1.rechnen(5); system("PAUSE"); return EXIT_SUCCESS; }Danke!
Gruß
-
Eine Variable wird nicht fix initialisiert, sondern... variabel. Das hängt eigentlich immer von Argumenten im Constructor-Aufruf ab, deswegen wird dadurch initialisiert.
Wenn Du etwas fix initialisieren möchtest, dann willst Du eigentlich keine Variable, sondern eine statische Konstante. Im Klassenkontext also eine
static const int bla = 11;Und für solche Konstanten funktioniert diese Schreibweise dann auch wieder.

-
Du könntest es
staticmachen. Aber wieso willst du ihn nicht im CTor?EDIT: Schon das zweite Mal zu lahm

-
Achwas, eben haben wir uns doch gut ergänzt. Ansonsten Redundanz durch Mehrfachantwort zur Verifizierung der Aussage.

-
Danke für die Antworten!
Was meinst du denn mit CTor?
Noch eine Frage zur Standardsichtbarkeit von C++:
Sind die Attribute und Variablen wenn man keine Sichtbarkeit angibt standardmäßig mit private deklariert?
Bei Java ist ja dann die Sichtbarkeit "Package local" (ich glaube das bedeutet dass man innerhalb des packages die Sichtbarkeit "public" hat, oder?)
Danke!
Gruß
-
RR23 schrieb:
Was meinst du denn mit CTor?
Constructor.
RR23 schrieb:
Sind die Attribute und Variablen wenn man keine Sichtbarkeit angibt standardmäßig mit private deklariert?
Bei
classsind sieprivate. Beistructaber sind siepublic. Genau wie bei der Vererbung...
-
Eine solche Möglichkeit zur Initialisierung ist übrigens für C++0x geplant:
http://www2.research.att.com/~bs/C++0xFAQ.html#member-init
-
Das was du im Ctor machst ist keine Initialisierung, sondern eine Zuweisung. Wenn dann doch bitte richtig! Komisch das es hier noch niemand korrigiert hat?
Was du gemacht hast ist folgendes: es wird das Objekt kreiert, samt Member-Variablen. Bei primitiven Typen mit einem undefinierten Wert! Und dann im Ctor-Scope wird verspätet der Wert 6 zugewiesen.
Wenn du initialisieren willst, mußt du das in der Initialisierungsliste tun:
class Testen { int zahl1, zahl2; public: Testen() : zahl2(6) { } };Hier wird gleich der Wert 6 beim Anlegen von zahl2 gesetzt. Das wird besonders wichtig, wenn du später keine primitiven Datentypen nutzt, sondern Strukturdaten bzw. Objekte. Dann wird der Unterschied sogar Auswirkungen im Verhalten zeigen!
-
thomas___ schrieb:
Eine solche Möglichkeit zur Initialisierung ist übrigens für C++0x geplant:
http://www2.research.att.com/~bs/C++0xFAQ.html#member-initIch sehe nicht ganz den Nutzen einer solchen Konstruktion. Wenn ein für alle Objekte sichtbarer, konstanter, privater Wert vorhanden ist, braucht man ihn doch nicht für JEDES Objekt zu erstellen (ich weiß jetzt nicht, ob dies in der Praxis und im Maschinencode so gehandhabt wird, aber die Syntax impliziert dies doch recht stark).
Allerdings wäre es schön, so etwas wie einen statischen Konstruktor in C++ zu haben, wie in C#. Oder bin ich mal wieder nicht aktuell und gibt es das bereits?
-
Glühbirne schrieb:
thomas___ schrieb:
Eine solche Möglichkeit zur Initialisierung ist übrigens für C++0x geplant:
http://www2.research.att.com/~bs/C++0xFAQ.html#member-initIch sehe nicht ganz den Nutzen einer solchen Konstruktion. Wenn ein für alle Objekte sichtbarer, konstanter, privater Wert vorhanden ist, braucht man ihn doch nicht für JEDES Objekt zu erstellen (ich weiß jetzt nicht, ob dies in der Praxis und im Maschinencode so gehandhabt wird, aber die Syntax impliziert dies doch recht stark).
Der Wert ist nicht konstant!
-
SeppJ schrieb:
Der Wert ist nicht konstant!
Mein innerer Parser scheint wohl nicht zu funktionieren ;), denn ich kann deinen Satz nicht auslösen! Ist er eine Berichtigung? Eine Erklärung?
-
Glühbirne schrieb:
SeppJ schrieb:
Der Wert ist nicht konstant!
Mein innerer Parser scheint wohl nicht zu funktionieren ;), denn ich kann deinen Satz nicht auslösen! Ist er eine Berichtigung? Eine Erklärung?
Naja, ein Widerspruch zu:
Glühbirne schrieb:
Wenn ein für alle Objekte sichtbarer, konstanter, privater Wert vorhanden ist,
Die Variable wird zwar immer mit dem gleichen Wert initialisiert, kann aber jederzeit geändert werden.
-
manni66 schrieb:
Die Variable wird zwar immer mit dem gleichen Wert initialisiert, kann aber jederzeit geändert werden.
Ach so ... na, das stimmt wohl. Wieder was gelernt, danke!

-
[OT]
Viel zu spät hin oder her - es ist als Lernender / Anfänger
ein schönes Gefühl, wenn man die Antwort gewusst hätte.
*feststell*

[/OT]