default-Konstruktor



  • Hallo,

    angenommen, ich hab eine Klasse ohne definierten Konstruktor:

    class Klasse{
    }
    

    Gibt es eigentlich einen Unterschied darin, wie man ein Objekt erzeugt:
    also

    Klasse* k = new Klasse();
    oder
    Klasse* k = new Klasse;

    Wir haben structs immer ohne diese Klammern erzeugt. Jetzt hab ich gelesen, dass der Unterschied zwischen structs und class minimal ist und diese schreibweise für Klassen probiert...
    Macht das hier einen Unterschied?



  • Gibt keinen Unterschied. Ich schreibe die Klammern aus gewohnheit. Die sind nur Pflicht wenn du Argumente an einen Nicht-Default-Konstruktor übergeben willst/musst.



  • Die Schreibweise ist gleichwertig, wenn deine Klasse einen Konstruktor hat, der keine Parameter übernimmt(eben z.B. den vom Compiler generierten)



  • Es gibt einen Unterschied, wenn Du das Objekt nicht mit new anlegst:

    Klasse objekt;
    

    legt ein Objekt an

    Klasse funktion();
    

    deklariert eine Funktion, die Klasse als Typen hat und keine Argumente nimmt.

    mfg Torsten



  • invoices schrieb:

    Jetzt hab ich gelesen, dass der Unterschied zwischen structs und class minimal ist und diese schreibweise für Klassen probiert...
    Macht das hier einen Unterschied?

    laut Stroustrup ist per definition ein struct eine klasse in der alles public ist.
    wenn man so will:
    struct Foo{…}; ist äquivalent zu class Foo{ public: … };

    ich würde aber
    Klasse* k = new Klasse();
    bevorzugen. bei
    Klasse* k = new Klasse;
    denk ich immer an einen typo 😉



  • Ich würde

    Klasse klasse = new Klasse;
    

    bevorzugen, um konsistent zu

    Klasse klasse;
    

    zu sein.



  • ConfusedGuy schrieb:

    ich würde aber
    Klasse* k = new Klasse();
    bevorzugen. bei
    Klasse* k = new Klasse;
    denk ich immer an einen typo 😉

    Komisch.

    ich würde aber
    Klasse* k = new Klasse;
    bevorzugen. bei
    Klasse* k = new Klasse();
    denk ich immer an einen typo 😉



  • ConfusedGuy schrieb:

    laut Stroustrup ist per definition ein struct eine klasse in der alles public ist.
    wenn man so will:

    Das gilt nur für c++, aber nicht für c oder?
    Oder konnte man in C auch schon Funktionen innerhalb structs definieren?



  • ehh keine ahnung. aber da es keine klassen in c gibt verstehe ich deine frage nicht 🙂



  • invoices schrieb:

    angenommen, ich hab eine Klasse ohne definierten Konstruktor:

    class Klasse{
    }
    

    Ein richtiges Beispiel mit Datenelementen und ohne fehlendes ; wäre nett gewesen.

    invoices schrieb:

    Gibt es eigentlich einen Unterschied darin, wie man ein Objekt erzeugt:
    also

    Klasse* k = new Klasse();
    oder
    Klasse* k = new Klasse;

    Wir haben structs immer ohne diese Klammern erzeugt. Jetzt hab ich gelesen, dass der Unterschied zwischen structs und class minimal ist und diese schreibweise für Klassen probiert...
    Macht das hier einen Unterschied?

    Es ist ziemlich wurscht, ob du hier class oder struct benutzt. Die Initialisierung macht aber schon einen Unterschied in diesem Fall. Denn hier handelt es sich um einen POD-Typen. Und bei PODs führt das erste dazu, dass die Datenelemente "value initialized" werden und im zweiten Fall, also ohne die Klammern, die Elemente uninitialisiert bleiben.

    Beispiel:

    struct podclass {
      int i;
    };
    
    int main() {
      podclass* p = new podclass;   // keine Initialisierung
      podclass* q = new podclass(); // "Wert-Initialisierung"
      std::cout << p->i << '\n'; // #1
      std::cout << q->i << '\n'; // #2
    }
    

    #1 gibt in der Praxis Datenmüll aus. Strenggenommen ist das Auslesen von uninitialisierten Objekten (ausgenommen, man greift auf das Objekt per char* oder unsigned char* zu) verboten.
    #2 gibt 0 aus. "value initialization" bedeutet bei POD-Klassen dass alle Elemente "value-initialized" werden. Und bei Zeigern, Ganzzahlen und Floatingpoint-Variablen läuft das auf eine Initialisierung mit 0 hinaus. Das hat man vielleicht schonmal gesehen:

    template<class T>
    class vector
    {
      ...
      vector( size_type n, T const& c = T() );
      ...                               ^^^
      void resize( size_type n, T const& c = T() );
      ...                                    ^^^
    };
    

    Hier findet auch auf Aufruferseite eine "value initialization" bzw eine "default initialization" von des Objekts vom Typ T statt, je nachdem, was T genau für ein Typ ist. Im Fall T=int, ist T ein POD und der std::vector wird mit Nullen gefüllt aufgrund der "value initialization".



  • vielen dank für die antworten.

    ist es allgemein so, dass alle Klassenattribute zu 0 gesetzt werden, wenn man das Objekt mittels
    podclass* q = new podclass();
    erstellt? Gilt das auch, wenn ich einen Konstruktor selber definiere? Kann ich mir dann allgemein immer eine Initialisierung mit 0 sparen, wenn die Attribute dann automatisch zu 0 gesetzt werden?



  • invoices schrieb:

    ist es allgemein so, dass alle Klassenattribute zu 0 gesetzt werden, wenn man das Objekt mittels
    podclass* q = new podclass();
    erstellt?

    Wenn podclass ein POD ist, ja.

    invoices schrieb:

    Gilt das auch, wenn ich einen Konstruktor selber definiere? Kann ich mir dann allgemein immer eine Initialisierung mit 0 sparen, wenn die Attribute dann automatisch zu 0 gesetzt werden?

    Nein.


Log in to reply