Konstruktor besitzt einen Zeiger als Argument?



  • Hallo Community
    Beim lesen meines Programmierbuches bin ich mal wieder auf etwas gestossen, was mir nicht so ganz klar ist:

    //Das ist ein Konstruktor für eine x-beliebige Klasse
    Form(char* Name, int Breite, int Laenge, float Flaeche)
    {
        //irgendwas
    }
    

    Wieso muss man das char Argument als Zeiger und nicht so wie die anderen übergeben?
    Mein Compiler kompilierts nämlich nur richtig, wenns so ist wie oben, und nicht wenn es so wie die anderen Argumente übergeben wird.



  • "char" ist ein datentyp, mit dem man nur ein einzelnes zeichen speichern kann. Das will man jedoch nur äußerst selten haben, normalerweise arbeitet man mit zeichenketten. Da du jetzt aber sicherlich nicht vorhast, einen konstruktor mit 128 char-argumenten zu basteln, ist es einfacher, einen einzigen zeiger zu übergeben, der auf das anfang einer zeichenkette zeigt, die mit '\0' terminiert wird.

    In c++ gibt es für den zweck string-objekte. So eine art hülle für die ganzen zeichenketten, die für das hinundherkopieren und verlängern sorgt
    => string kann auch direkt, ohne zeiger übergeben werden

    \edit: und allgemein, was soll denn an einem zeiger als argument so seltsam sein?



  • Andrey schrieb:

    "char" ist ein datentyp, mit dem man nur ein einzelnes zeichen speichern kann. Das will man jedoch nur äußerst selten haben, normalerweise arbeitet man mit zeichenketten. Da du jetzt aber sicherlich nicht vorhast, einen konstruktor mit 128 char-argumenten zu basteln, ist es einfacher, einen einzigen zeiger zu übergeben, der auf das anfang einer zeichenkette zeigt, die mit '\0' terminiert wird.

    In c++ gibt es für den zweck string-objekte. So eine art hülle für die ganzen zeichenketten, die für das hinundherkopieren und verlängern sorgt
    => string kann auch direkt, ohne zeiger übergeben werden

    \edit: und allgemein, was soll denn an einem zeiger als argument so seltsam sein?

    Danke schonmal, ist mir um einiges klarer geworden. Wenn ich ein char-Array definiere und einen Zeiger darauf mache, zeigt der immer automatisch auf das nächste Objekt, oder?
    Zu deiner Frage:

    //Das ist ein Konstruktor wie am Anfang
    Form(int Breite, int Länge, float Fläche)
    

    Da sind ja auch keine Zeiger vorhanden 😃



  • Wenn ich ein char-Array definiere und einen Zeiger darauf mache, zeigt der immer automatisch auf das nächste Objekt

    ne... der zeiger zeigt dorthin, wohin du ihn zeigen lässt...

    char charArray[]="abcdefghijklmnopqrstuvwxyz";
    char* pChar;
    pChar=charArray; //zeigt auf a
    pChar=&charArray[1]; //zeigt auf b
    pChar++; //zeigt auf c
    pChar+=5; //zeigt auf h
    pChar+=1000; //zeigt ins nirvana
    

    Zu deiner Frage:

    //Das ist ein Konstruktor wie am Anfang
    Form(int Breite, int Länge, float Fläche)
    

    Da sind ja auch keine Zeiger vorhanden 😃

    und... ?



  • Andrey schrieb:

    Wenn ich ein char-Array definiere und einen Zeiger darauf mache, zeigt der immer automatisch auf das nächste Objekt

    ne... der zeiger zeigt dorthin, wohin du ihn zeigen lässt...

    char charArray[]="abcdefghijklmnopqrstuvwxyz";
    char* pChar;
    pChar=charArray; //zeigt auf a
    pChar=&charArray[1]; //zeigt auf b
    pChar++; //zeigt auf c
    pChar+=5; //zeigt auf h
    pChar+=1000; //zeigt ins nirvana
    

    Zu deiner Frage:

    //Das ist ein Konstruktor wie am Anfang
    Form(int Breite, int Länge, float Fläche)
    

    Da sind ja auch keine Zeiger vorhanden 😃

    und... ?

    Also ich meinte oben nicht auf das nächste sondern erste Objekt(so wie dus richtigerweise geschrieben hast).
    Wegen den Zeigern: Jeman hat mich gefragt, was so speziell an Zeigern als Argumente sein soll und da hab ich dieses Beispiel gebracht.



  • Gamer4 schrieb:

    Jeman hat mich gefragt, was so speziell an Zeigern als Argumente sein soll und da hab ich dieses Beispiel gebracht.

    Man sollte immer Zeiger an Funktionen übergeben, wenn man größere Objekte in der Funktion manipulieren will. Hier mal ein Beispiel wie ich es gelernt und mir angewöhnt habe.

    class big
    {
       // viele viele Variablen
    
    };
    
    void foo(int i; big* p, const big& r)
    {
      // mache irgendwas
    }
    

    int i übergebe ich ganz normal. Ein Zeiger auf elemtare Datentypen macht nur Sinn, wenn die Funktion mehrere Variablen ändern soll.

    big* p ist ein Zeiger auf eine Instanz der Klasse big. Hierbei muss halt nicht die gesammte Instanz kopiert werden, was wieder Rechenleistung spart.

    const big& r ist eine konstante Referenz auf eine Instant der Klasse big. Der Vorteil bei Referenzen ist die Schreibweise. Man kann eine, an eine Funktion übergebene, Referenz genauso wie eine normal übergeben Variable nutzen. Ich nutze immer eine Konstante Referenz, wenn meine Funktion das Objekt nicht manipulieren soll, also nur für weitere Operationen auf andere Objekte oder für die Ausgabe benötigt.

    Ich hoffe das hat dir ein wenig geholfen.

    Gruß Spartaner


Anmelden zum Antworten