Frage zu const und static



  • Hallo,

    Ich bin absoluter Anfänger in Sachen C++. Geringe Vorkenntnisse in C hab ich, aber ist auch eher dürftig. Wir sind heute im Studium mit C++ angefangen.

    In unserem Script steht folgendes zu statischen Methoden:

    Statische Methoden können mit oder ohne Instanz der Klasse aufgerufen werden.

    Jetzt frag ich mich wozu das gut ist, wenn es keine Instanz der Klasse gibt. Instanz heißt doch, dass die Klasse initialisiert wurde, richtig?

    zb: (code ist nur beispielhaft und nicht komplett)

    class Account
    		{ public:
    		    static int getDeposits()
    				{
    				 return deposits;
    				}
    		  private:
    		    static int deposits;};
    

    jetzt wäre die klasse doch nur definiert, richtig?

    was bringt es mir jetzt, zb

    int total = Account::getDeposits();
    

    aufzurufen, wenn noch keine instanz vorhanden ist, somit auch dem deposit kein wert zugeteilt ist?

    Oder ist das einfach nur ne Möglichkeit von aussen an die Methode ranzukommen? Würde es nicht funktionieren, wenn man die static deklaration weglassen würde?

    ich hoffe es sind nich allzu dumme fragen, aber ich check es einfach nicht^^



  • In C++ macht eine Klasse, die nur aus statischen Funktionen und Variablen besteht keinen Sinn. Man könnte das gleiche Verhalten auch mit einem Namespace lösen.

    Manchmal gibt es aber Funktionen, die auch ohne, dass die Klasse erstellt wird bereits verfügbar seien sollen. Stell dir vor, du hast eine Klasse, die einen String darstellt. Diese Klasse hat meinetwegen eine statische Methode, um alle führenden Leerzeichen zu löschen.

    Du könntest dadurch bequem folgendes machen:

    String::LeftTrim("   Test");
    

    Das hat den Vorteil, dass du die Funktion geordnet hast. Sie liegt also nicht im globalen Namespace, sondern in der Klasse String. Dabei verwaltet String nicht nur einen String, sondern stellt auch weitere Funktionalitäten zur Verfügung, die auch für andere Zeichenketten nützlich wären.

    Ohne static müsste man folgendes machen:

    String temp = "";
    
    temp.LeftTrim("   bla");
    

    Dein Beispiel würde ohne static nicht klappen, da die statische Methode auch nur auf statische Variablen zugreifen kann.



  • raised.fist schrieb:

    class Account
    		{ public:
    		    static int getDeposits()
    				{
    				 return deposits;
    				}
    		  private:
    		    static int deposits;};
    

    jetzt wäre die klasse doch nur definiert, richtig?

    was bringt es mir jetzt, zb

    int total = Account::getDeposits();
    

    aufzurufen, wenn noch keine instanz vorhanden ist, somit auch dem deposit kein wert zugeteilt ist?

    Die Klasse ist defininiert, die statische Variable deposits jedoch nicht. Dort fehlt einmal in einer Source-Datei die definition der Variable:

    int Account::deposits = 5;
    

    Dort kannst du sie, wie man hier sehen kann, auch gleich initialisieren.



  • ghjghj schrieb:

    [...]

    String::LeftTrim("   Test");
    

    [...]

    Ungünstiges Beispiel. Left-Trim kann genausogut als freie Funktion definiert werden, im gleichen Namespace wie String. Statische Methoden haben imo meist nur dann einen Sinn, wenn sie entweder auf statische Variablen zugreifen oder protected sind.


Anmelden zum Antworten