Announcement

Collapse
No announcement yet.

Was kommt raus - und wieso?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Was kommt raus - und wieso?

    <pre>
    #include "string.h"

    class CMyClass
    {
    private:
    char m_Konstructor[200];
    public:
    CMyClass();
    CMyClass( int Number);
    int m_Number;
    GetText( char* buffer);
    };
    CMyClass::CMyClass()
    {
    strcpy( m_Konstructor, "Konstruktor 1");
    m_Number = 10;
    }
    CMyClass::CMyClass( int Number)
    {
    strcpy( m_Konstructor, "Konstruktor 2");
    m_Number = Number;
    }
    CMyClass::GetText( char* buffer)
    {
    sprintf( buffer, "%s %d\n", m_Konstructor, m_Number);
    }
    int main(int argc, char* argv[])
    {
    char buffer[200];

    CMyClass MyClass;
    MyClass = NULL;
    MyClass.GetText( buffer);
    printf(buffer);

    MyClass = CMyClass( 50);
    MyClass = 150;
    MyClass.GetText( buffer);
    printf(buffer);

    //Nur damit die Ausgabe stehenbleibt
    char Tempbuffer[200];
    gets( Tempbuffer);
    return 0;
    }
    </pre>

  • #2
    Hallo Bernhard,

    die Ausgabe des Programms ist:

    Konstruktor 2 0<BR>
    Konstruktor 2 150

    Ich nehme mal an, daß Du diese Frage stellst, weil Du aus dem Delphi Bereich kommst?

    Ich vermute mal, Du möchstest wissen, warum beim ersten Objekt Konstruktor 2 0 rauskommt.

    >char buffer[200];<BR>
    sollte klar sein

    >CMyClass MyClass;<BR>
    instanzieren des Objekts MyClass (wird nie verwendet)

    >MyClass = NULL; <BR>
    erneutes instanzieren des Objketes MyClass, entspricht CMyClass MyClass(0);

    >MyClass.GetText( buffer); <BR>
    Text holen

    >printf(buffer); <BR>
    und ausgeben

    >MyClass = CMyClass( 50); <BR>
    nochmal wird MyClass neu instanziert, entspricht CMyClass MyClass(50); (Objekt wird ebenfalls nie verwendet)

    >MyClass = 150; <BR>
    und nochmal wird MyClass neu instanziert, entspricht CMyClass MyClass(150);

    In C++ ist es möglich den Konstruktor auf mehrere Weisen aufzurufen als CopyConstruktor (MyClass = 150) oder 'normal' CMyClass MyClass(int). Der Unterschied ist, daß bei der ersten Methode zuerst ein temporäres Objekt erstellt wird, das anschließende MyClass zugewiesen wird. Ich hoffe ich das noch richtig hinbekommen, ist schon ein Weilchen her...

    Die Zuweisung von MyClass = NULL (auf Zeigerebene) funktioniert nur, wenn das Objekt mit CMyClass* MyClass = new CMyClass(); erzeugt wird.

    Grüße Joche

    Comment


    • #3
      Danke Jochen,

      es geht um einen Kollegen der auch C++ Programmiert und der seine Sourcen in der Art:

      CMyClass *MyClass

      auf

      CMyClass MyClass

      umstellte und dabei entsprechende noch nicht gekannte Effekte erlebt hat.

      Wird der Konstrutor entsprechent mit explizit definiert:

      explizit CMyClass( int Number);

      dann tritt bei den obigen NULL/150-Zuweisungen eine Fehlermeldung auf, da dieser implizierte Konstruktoraufruf nicht mehr funktioniert

      Comment


      • #4
        Hallo Bernhard,

        ja das ist korrekt, bei explicit dürfen nur Parameter vom selben Klassentyp verwendet werden...

        <I>CMyClass *MyClass <BR>
        auf <BR>
        CMyClass MyClass</I> <BR>
        Warum das?? m.E. sollten Objekte in C++ grundsätzlich nur mit new instanziert werden. Sollte zum einen schnelleren Code geben, zum anderen hat man die Lebensdauer der Objekte besser im Griff.

        Grüße Joche

        Comment

        Working...
        X