Unterschied dieser Zeichen . -> ::



  • Hallo, oft sehe ich in Quellcodes diese Zeichen:

    eineKlasse::eineMethode();
    eineKlasse.eineMethode();
    eineKlasse->eineMethode();

    Was ist der Unterschied zwischen diesen drei Versionen? Wann muss man :: wann -> und wann . benutzen? Würde mich über Aufklärung freuen! 🙂

    Tschüss!



  • eineKlasse::eineMethode(); = Aufruf einer Statische Methode der Klasse
    eineKlasse.eineMethode(); = Aufruf einer Methode durch das Objekt
    eineKlasse->eineMethode(); = Aufruf einer nicht statischen Methode durch ein Zeiger auf die Klasse

    eineKlasse->eineMethode(); = (ist das selbe wie) (*eineKlasse).eineMethode();



  • Firefighter schrieb:

    eineKlasse::eineMethode();

    Oder aber auch Aufruf der "Basisversion" einer Funktion, also im Falle das man sie beim abgeleiteten Typen übschrieben hat. Verständlich ausgedrückt, oder? 😉



  • Geil wie Sau Fellhuhn 😃 Nee, aber das wäre auch eine Möglichkeit.



  • Firefighter schrieb:

    eineKlasse::eineMethode(); = Aufruf einer Statische Methode der Klasse

    Muss nicht sein. Kann auch die Konstruktion eines Objektes sein.

    Firefighter schrieb:

    eineKlasse->eineMethode(); = Aufruf einer nicht statischen Methode durch ein Zeiger auf die Klasse

    Muss auch nicht sein. -> Kann beliebig überladen werden. Das heisst eineKlasse muss kein Zeiger auf ein Objekt sein, um den -> benutzen zu können. (Smartpointer).

    Firefighter schrieb:

    eineKlasse->eineMethode(); = (ist das selbe wie) (*eineKlasse).eineMethode();

    Muss auch nicht sein. Da -> und . verschieden überladen sein können, kann das komplett was anderes bedeuten. Selbst wenn * und -> den gleichen Rückgabewert haben, kann die Unterschiedliche benutzung von -> und . etwas anderes Bedeuten.



  • Fellhuhn schrieb:

    Firefighter schrieb:

    eineKlasse::eineMethode();

    Oder aber auch Aufruf der "Basisversion" einer Funktion, also im Falle das man sie beim abgeleiteten Typen uebschrieben hat. Verstaendlich ausgedrueckt, oder? 😉

    oder bei Zugriff auf Objekte innerhalb eines anderen Namespaces

    namespace sp
    {
        void foo();
    }
    
    sp::foo();
    

    uebrigens gelten alle drei nicht nur fuer Methoden einer Klasse, sondern auch fuer deren oeffentliche Membervariablen

    class myClass
    {
    public:
        int i;
    }
    
    myClass* a = new MyClass();
    myClass b;
    
    std::cout << a->i << std::endl;
    std::cout << b.i << std::endl;
    


  • Hier stand Blödsinn... 🤡



  • Ok dann habe ich da wohl ein paar vergessen, aber ich schätze mal der Threadersteller wollte nur die Grundlegenden unterschiede und nicht alle anderen Möglichkeiten. Kann mich aber auch irren.



  • Tachyon schrieb:

    Hier stand blödsinn... 🤡

    Hier steht Blödsinn. 😉

    SCNR



  • Danke für die Beteiligung, ich verstehe leider immer noch nicht Folgendes:

    // eineKlasse::eineMethode(); = Aufruf einer Statische Methode der Klasse
    K :: M();
    M ist die statische Methode der Klasse K. K ist eine Klasse und kein instanziiertes Objekt.

    // eineKlasse.eineMethode(); = Aufruf einer Methode durch das Objekt
    I . M();
    I ist die Instanz einer Klasse und M eine Methode dieser Klasse.

    // eineKlasse->eineMethode(); = Aufruf einer nicht statischen Methode durch ein Zeiger auf die Klasse
    K -> M();
    Ich dachte eine nicht-statische Methode kann nur aufgerufen werden, wenn vorher eine Instanz (Objekt) der Klasse erzeugt wurde??? Kann das jemand kurz erläutern?

    Tschüss



  • mikser schrieb:

    // eineKlasse->eineMethode(); = Aufruf einer nicht statischen Methode durch ein Zeiger auf die Klasse
    K -> M();
    Ich dachte eine nicht-statische Methode kann nur aufgerufen werden, wenn vorher eine Instanz (Objekt) der Klasse erzeugt wurde??? Kann das jemand kurz erläutern?

    Fügen wir mal die zwei Worte "Instanz einer" hinzu...:

    Aufruf einer nicht-statischen Methode durch einen Zeiger auf die Instanz einer Klasse.

    Vielleicht ist es nun besser verständlich.


Anmelden zum Antworten