Problem beim erstellen eines Objekts mit new
-
Ist halt so geht auch ohne new in C++. Dies sind dann aber lokale Objekte die mit dem Ende des Scopes vernichtet werden. Zugriff über den .-operator.
Folgendes darfst du machen:
Obj a; //Objekt erstellen Obj *p = &a; //Zeiger der auf lokales Objekt zeigt //Zugriffe auf Funktionen a.foo(); p->foo(); //Mit ende des Scopes darf p nicht mehr verwendet werden, da Objekt zerstört wurdeObj *a = new Obj; //Zeiger der auf Heap-Objekt zeigt a->foo(); //Zugriff auf Funktion delete a; //Zerstören des Objektes a darf nicht mehr verwendet werdenEdit: In C++ vermeidet man das Verwenden von (rohen) Pointern und verwendet Container und Smart-Pointer, die automatisch Speicher reservieren und wieder freigeben.
-
wasd schrieb:
Bin jetzt ein bisschen verwirrt.. dachte ein objekt muss immer mit new() erstellt werden (kann auch sein das das nur bei java so ist), weil eine Variable doch nur ein primitiver Datentyp (int, short usw) oder eine Referenz auf ein Objekt sein kann.
Ja, das ist Java. In C++ sind die Unterschiede zwischen primitiven Datentypen und Klassen klein. Es gibt manuelle und automatische Speicherverwaltung (hat nicht direkt mit Stack vs. Freestore zu tun), wobei letztere fast immer zu bevorzugen ist, weil einfacher, sicherer, weniger fehleranfällig. Stichwort RAII.
wasd schrieb:
ansonsten müsste ja bei jeder Zuweisung das gesamte Objekt kopiert werden..
Richtig, aber mit einer Zuweisung willst du das ja gerade. Willst du nur einen Verweis, erstellst du eben einen Zeiger oder eine Referenz auf das Objekt.
-
Okay danke habs verstanden. mal ne andere Frage: Hab gelesen dass inline klassenmethoden schneller verarbeitet werden als die normalen. kann ich dann nicht einfach alle methoden Inline machen, sofern die größe der datei keine rolle spielt??
-
wasd schrieb:
Okay danke habs verstanden. mal ne andere Frage: Hab gelesen dass inline klassenmethoden schneller verarbeitet werden als die normalen.
Kann man gar nicht mehr allgemein so sagen. Manchmal ist outline auch schneller, wegen Cache-Lokalität. Der Compiler macht automatisch die inline, die er für würdig hält, und kann die Funktionen schon verflixt gut einschätzen.
-
Ahh okay, eine Frage hab ich noch

Hab schon öfters gesehen, das char* pointer für Zeichenketten benutzt werden.
in diesem Beispiel zeigt der pointer ja auf das erste byte des Strings, also das "T".
char *t; t = "Test!"; cout << t;Ich versteh nicht, wie das Programm funktionieren kann, da erstens bei der initialisierung der * vor dem t fehlt und die Ausgabe dann doch eigentlich die Adresse sein müsste?
und zweitens woher weiß das Programm bei cout << t die Länge des Strings?
-
Erstens muss es
const char* t = "blubb";heißen.
Zweitens hat jedes string-Literal eine Adresse, auch wenn das zuerst komisch erscheint. Der string liegt aber in einem Read-Only bereich, du darfst da also nichts ändern.C-Strings sind 0-terminiert, das heißt, der string hat am Ende immer eine 0, nicht '0' oder "0" sondern 0. Die Länge des String "muh" ist damit 4.
-
Der Code funktioniert garnicht (undefiniertes Verhalten) Der Pointer zeigt auf irgendeine Adresse. Es wurde weder eine gültige Adresse auf dem Stack angegeben ) noch Speicher auf dem Heap für den String reserviert. Wie ich in meinem Post vorher schon erläutert habe.
Ein String wird immer mit '\0' abgeschlossen. somit hat ein char array[6] auch nur maximal 5 Zeichen, da das Sechste für die Nullterminierung benötigt wird. Strings in Anführungszeichen angegeben haben eine Nullterminierung.
-
HighLigerBiMBam schrieb:
Der Code funktioniert garnicht (undefiniertes Verhalten) Der Pointer zeigt auf irgendeine Adresse. Es wurde weder eine gültige Adresse auf dem Stack angegeben ) noch Speicher auf dem Heap für den String reserviert. Wie ich in meinem Post vorher schon erläutert habe.
Bei mir gehts schon die ausgabe ist "Test!"
soweit ich weiß ist
char* t = "blubb";die verkürzte version von
char *t; t = "blubb";
-
Nein, die richtige

-
314159265358979 schrieb:
Nein, die richtige

okay und was ist an der anderen falsch??
-
Das const fehlt.
-
314159265358979 schrieb:
Das const fehlt.
vielleicht sollte meine Variable auch gar keine Konstanste sein?

-
Wenn du den string so zuweist, MUSS sie const sein.
-
wasd schrieb:
Ich versteh nicht, wie das Programm funktionieren kann, da erstens bei der initialisierung der * vor dem t fehlt und die Ausgabe dann doch eigentlich die Adresse sein müsste?
Du weist die Adresse des Stringliterals dem
char-Zeiger zu. Die Ausgabe funktioniert, weil der Stream-Operator fürchar*überladen ist.wasd schrieb:
vielleicht sollte meine Variable auch gar keine Konstanste sein?
Ist sie so oder so nicht. Aber der Zeiger soll auf
constzeigen. "Der string liegt aber in einem Read-Only bereich, du darfst da also nichts ändern." Daher ist bei Stringliteralen nurconst char*sinnvoll.Wo liegt dein momentanes Problem?
-
Hast du das gelesen?
wasd schrieb:
soweit ich weiß ist
char* t = "blubb";die verkürzte version von
char *t; t = "blubb";Nein. Kürzlich gab es wieder ein Thread darüber. Der erste Code ruft den Ctor auf und der zweite den Zuweisungsoperator. Bei korrekter Implentierung spielt es keine Rolle. Aber beim ersten wird der Ctor aufgerufen und beim zweiten wird der Ctor und der Zuweisungsoperator aufgerufen.
-
EOutOfResources schrieb:
Der erste Code ruft den Ctor auf
char*hat keinen Konstruktor. Bei skalaren Typen macht sind beide Schreibweisen äquivalent. Allerdings ist eine schnelle Initialisierung zu bevorzugen, bei der zweiten Version sehe ich keine Vorteile.