2010-02-18 20 views
7

Ich habe eine Frage über statische und nicht statische Funktion und Variable.nicht statische vs. statische Funktion und Variable

1) nicht statische Funktion Zugriff statische Variable.

Es ist OK!

class Bar 
{ 
public: 

    static int i; 

    void nonStaticFunction() { 

     Bar::i = 10; 

    } 

}; 

int Bar::i=0; 

2) nicht-statische Funktion Zugriff nicht-statische Variable

Definitiv OK!

3) statische Funktion Zugriff statische Variable & funciton

Definitiv OK!

4) statische Funktion Zugriff nicht-statische Funktion

Es ist OK

class Bar 
{ 
public: 
    static void staticFunction(const Bar & bar) 
    { 
     bar.memberFunction(); 

    } 

    void memberFunction() const 
    { 

    } 

} 

5) statische Funktion Zugriff nicht-statische Variable

Es ist in Ordnung oder nicht in Ordnung? Ich bin darüber verwirrt!

Wie dieses Beispiel

class Bar 
{ 
public: 
    static void staticFunction(Bar & bar) 
    { 
     bar.memberFunction(); 

    } 

    void memberFunction() 
    { 

     i = 0; 
    } 

    int i; 

}; 

Antwort

9

statische Funktion Zugriff nicht-statische Variable

Es ist in Ordnung oder nicht in Ordnung? Ich bin verwirrt über dies!

Beim Aufruf ist eine statische Funktion nicht an eine Instanz der Klasse gebunden. Klasseninstanzen (Objekte) werden die Entitäten sein, die die "nicht statischen" Variablen enthalten. Daher können Sie von der statischen Funktion nicht auf sie zugreifen, ohne dass sie tatsächlich an eine bestimmte Instanz übergeben oder dort gespeichert werden.

Also ja, der Code in Ihrem letzten Beispiel ist gültig, weil Sie in einer Instanz übergeben werden. Sie konnten jedoch nicht:

static void staticFunction() 
{ 
    // error, this function is static, and is therefore 
    // not bound to a specific instance when called 
    i = 5; 


} 
1

Es ist nicht in Ordnung. Statische Funktionen sind zugänglich, ohne eine Instanz einer Klasse zu haben, und können daher nicht auf Informationen zugreifen, für die Sie eine Instanz benötigen würden.

Zum Beispiel brauchen Sie kein Auto, um zu wissen, wie viele Räder es hat, Blaupausen für ein allgemeines Auto würden genügen (das könnte statische Information sein), aber Sie können nicht sagen, welche Farbe das Auto hat, außer Sie (diese Information benötigt eine bestimmte Instanz eines Objekts.) zu einem bestimmten Auto re Bezug

7

Statisch bedeutet, dass dies unabhängig von einer bestimmten Instanz der Klasse ist. Statische Methoden haben keinen Zugriff auf den Zeiger this. Aus diesem Grund müssen Sie sie unter der Klassenbezeichnung aufrufen.

Wenn Sie die Static-Methode aufrufen, ist möglicherweise nicht einmal eine Instanz der Klasse definiert.

nicht-statische Mittel impliziert eine Instanz und könnte bei verschiedenen Instanzen unterschiedlich sein.

Es macht also prinzipiell keinen Sinn, von statischen Methoden auf nicht statische Member zuzugreifen.

1

Dazu müssen Sie verstehen, was statisch ist.

Statische Datenelemente gibt es nur einmal für die gesamte Klasse, im Gegensatz zu nicht statischen Datenelementen, die in jeder Instanz einer Klasse einzeln existieren. Sie haben einen Klassenbereich und sind nicht an eine Instanz der Klasse gebunden.

statisches Element der Klasse zuzugreifen, verwenden wir das Format wie unten ::

wenn Sie 10 Objekte einer Klasse erstellt haben. Angenommen, Sie konnten auf die nicht statische Variable im statischen Member der Klasse zugreifen. Wenn die statische Funktion aufgerufen wird, welches Member des Objekts muss geändert werden?

Verwandte Themen