New operator



  • Hallo,
    Ich bin c++ Anfänger und habe eine frage zum new operator. Und zwar wird durch new ja speicher bereit gestellt und der konstruktor gerufen(korrigert mich bitte wenn ich falsch liege). Wenn ich jetzt aber im konstruktor meiner klasse so speicher bereit stellen möchte: text = new char[len + 1]; ist ja kein konstruktor aufruf mehr notwendig. Daher werde ich nicht schlau daraus warum es so trotzdem funktioniert und würde mich freuen wenn mir jemand das erklären könnte.

    Schon mal vielen Dank.


  • Mod

    Was macht denn der Konstruktor von char? Antwort: Nichts.

    PS: Da das anscheinend ein Lernprojekt zu Speicherverwaltung ist, wäre es übrigens gut für dich, wenn du hier später deinen Code zeigst, wenn er fertig ist, denn viele Anfänger machen da beim ersten Mal alles falsch, was man falsch machen kann.
    Wobei man dieses Wissen dann hinterher im echten Leben fast nie wieder braucht, da man eigentlich so gut wie nie mehr Klassen schreibt, die selber Ressourcen verwalten, sondern eigentlich immer die fertigen Halter aus der Standardbibliothek nimmt. Ganz besonders für Speicher.
    Ist aber trotzdem nützlich, zu wissen, wie die funktionieren. Daher mach die Aufgabe, aber frag auch unbedingt, ob du es richtig gemacht hast.



  • Ich verstehe deine Frage nicht. Das "new char[]" geschieht doch im Konstruktor (wo sonst?) - wieso sollte jetzt auf einmal kein Konstruktor nötig sein?

    Oder meinst du das new char[length+1] als solches? Das konstruiert dir den Zeiger, initialisiert die chars aber nicht. Oder willst du darauf hinaus, dass sich ein "einfacher" Typ wie char hier anders verhält als eine Klassentyp wie string? Es gibt einen Unterschied zu new char[length+1]() (mit rundem oder geschwungenem Klammernpaar dahinter), dort würde initialisiert.

    Edit: im Standard heißt es dazu:
    Im Kapitel 8.5 zu "Initializers":
    7
    To default-initialize an object of type T means:
    7.1)
    — If T is a (possibly cv-qualified) class type (Clause 9), constructors are considered. The applicable
    constructors are enumerated (13.3.1.3), and the best one for the initializer () is chosen through overload
    resolution (13.3). The constructor thus selected is called, with an empty argument list, to initialize the
    object.
    7.2)
    — If T is an array type, each element is default-initialized.
    7.3)
    — Otherwise, no initialization is performed.

    Und in 5.3.4 über "New" steht:
    17
    A new-expression that creates an object of type T initializes that object as follows:
    (17.1)
    — If the new-initializer is omitted, the object is default-initialized (8.5). [ Note: If no initialization is
    performed, the object has an indeterminate value. — end note ]
    (17.2)
    — Otherwise, the new-initializer is interpreted according to the initialization rules of 8.5 for direct-
    initialization.

    (Ich hoffe, dass das die relevanten Stellen sind)



  • Genau das new steht ja im Kontruktor. Aber da ich ja schon im Konstruktor bin und dort new benutze müsste durch das new ja schon wieder der konstruktor gerufen werden oder? Deswegen würde mir hier malloc sinnvoller erscheinen und ich wundere mich das es auch mit new funktioniert.



  • new T() ruft den Constructor von T und nich nochmal den Constructor worin der Aufruf von new zufällig enthalten ist.



  • tanonym schrieb:

    Genau das new steht ja im Kontruktor. Aber da ich ja schon im Konstruktor bin und dort new benutze müsste durch das new ja schon wieder der konstruktor gerufen werden oder? Deswegen würde mir hier malloc sinnvoller erscheinen und ich wundere mich das es auch mit new funktioniert.

    Du machst "new Klasse", was Speicher für eine Klasse-Instanz anfordert und den Konstruktor von Klasse aufruft.

    Der Konstruktor von Klasse ruft new char [N], was Speicher für N characters anfordert und den N-mal den Default-Konstruktor von char aufruft (welcher nichts bewirkt, aber dennoch aufgerufen wird).

    Du musst verstehen, dass das verschiedene Konstruktoren sind und dass das keine versteckte Rekursion oder sowas in der Art ist.



  • tanonym schrieb:

    Deswegen würde mir hier malloc sinnvoller erscheinen und ich wundere mich das es auch mit new funktioniert.

    1.) Als C++-Anfänger brauchst du malloc überhaupt nicht zu kennen. Vergiss es erst einmal.

    2.) Beachte auch SeppJs Text im "PS:"-Abschnitt.



  • Danke euch!! Das mit dem Konstruktor von char und das dadurch nicht so was wie rekursion abläuft war der Knackpunkt 😃


Anmelden zum Antworten