2010-02-10 11 views
5

Ich habe ein paar Fragen über das statische Schlüsselwort in C++ (und wahrscheinlich auch mit anderen Sprachen.) Was ist der Zweck der Erklärung einer Funktion als statisch?Fragen über das statische Schlüsselwort mit Funktionen und Daten

void static foo(int aNumber) { 
... }

Wie wäre es mit einer statischen Inline-Funktion?

void static inline foo(int aNumber) { 
... }

Gibt es einen Nutzen Sie das Schlüsselwort static mit einer Funktion zu verwenden, und stellen diese Vorteile gelten auch für Klasse-Funktionen? Ich weiß, dass einige Datentypen wie Structs und Arrays beim Kompilieren mit einem älteren Compiler statisch sein müssen, aber gibt es einen Punkt bei der Verwendung eines neuen ANSI-C++ Compilers (wie MS VC++ 2008)? Ich weiß, dass die Verwendung einer statischen Variablen innerhalb einer Schleife Zeit spart, indem die Daten im Speicher gehalten werden und Speicher nicht bei jeder Schleifeniteration neu zugewiesen wird. Wie wäre es jedoch, wenn eine Variable nur einmal deklariert wird, wie am Anfang einer Headerdatei oder innerhalb eines Namensbereichs?

+0

Fragen Sie gezielt nach Funktionen, die außerhalb einer Klasse/Struktur deklariert sind? – Bill

+0

Ich habe generell gefragt, danke für den Kommentar, aber Brian hat meine Fragen schon beantwortet. – Dooms101

Antwort

15

Abhängig von Kontext:

Wie viele Dinge in C++, static verschiedene Dinge bedeuten auf seinem Kontext abhängig.

In C++ ist es üblich, dass dasselbe Wort je nach Kontext unterschiedliche Bedeutungen hat.
Zum Beispiel:

  • * ist für die Multiplikation, dereferencing einen Zeiger und das Erstellen von Zeigern verwendet.
  • & wird verwendet, um die Adresse von Variablen zu erhalten, um eine Referenz zu deklarieren, und als ein bitweises AND-Operator.

Globale Verwendung statisch:

Wenn Sie eine Funktion oder eine Variable als statisch außerhalb einer Klasse und im globalen Rahmen zu erklären, ist es spezifisch nur diese Datei. Wenn Sie versuchen, diese Variable oder Funktion in einer anderen Datei zu verwenden (über eine Forward-Deklaration), erhalten Sie einen Verknüpfungsfehler.

Beispiel:

a.cpp:

static void fn() 
{ 
    cout<<"hello a!"<<endl; 
} 

b.cpp:

void fn(); 
void gn() 
{ 
    fn();//causes linking error 
} 

Mit dieser Funktion können Sie eine Funktion verwenden, die keine andere Datei jemals sehen werden, auf diese Weise Sie nicht dazu führen, möglich Linkerfehler eines mehrfach definierten Symbols. Die bevorzugte Methode, dies zu tun ist mit anonymen Namespaces aber:

a.cpp:

namespace 
{ 
    void fn() // will be static to a.cpp 
    { 
    cout<<"hello a!"<<endl; 
    } 
} 

Innerhalb einer Klasse Verwendung statischer:

Wenn Sie eine Funktion oder eine Variable als statisch innerhalb eines deklarieren Klasse (oder Struktur), es ist eine Klassenfunktion oder eine Klassenvariable. Dies bedeutet, dass es nur einen für diese ganze Klasse gibt. Eine Klassenfunktion kann nur Klassenvariablen verwenden.Eine Klassenvariable wird von allen Instanzen dieser Klasse gemeinsam genutzt.

class C 
{ 
public: 
    static void fn() 
    { 
    y = 4;//<--- compiling error 
    // can't access member variable within a static function. 
    } 

    int y; 
} 

Dies ist ein großartiges Feature zu verwenden, wenn Sie etwas haben, das zur Klasse der Objekte spezifisch ist, sondern auf eine Instanz nicht spezifisch.

Innerhalb einer Funktion zur Verwendung statischer:

Wenn Sie eine Variable als statisch innerhalb einer Funktion deklarieren, können Sie berücksichtigen, dass der Wert der Variablen bei Anrufen anhalten wird. Es wird nur einmal initialisiert.

Beispiel:

//Will print 0, then 1, then 2, ... 
void persistentPrintX() 
{ 
    static int x = 0; 
    cout << x << endl; 
    x++; 
} 

ich persönlich versuchen, dies zu vermeiden, und Sie sollten wahrscheinlich. Es ist nicht gut, einen globalen Staat zu haben. Es ist besser, Funktionen zu haben, die bei gleicher Eingabe die gleiche Ausgabe garantieren.

Genau wie in der englischen Sprache:

Das Konzept der kontextsensitiven Bedeutung C++ nicht spezifisch ist, können Sie es sogar in der englischen Sprache sehen.

  • Ich werde screen ein Film
  • Die screen auf dem Fernseher ist kaputt (Means den Film angezeigt) (Mittel einen Teil des TV)

Andere Bedeutungen in anderen Programmiersprachen :

Je nach Programmiersprache kann es eine andere Bedeutung geben, aber das erste, woran die meisten Leute denken, wenn Sie static sagen, ist eine Klasse vari able/function gegen eine Elementvariable/Funktion.

+0

Die verwirrendste Verwendung von statischen überhaupt. Hätten sie nicht nur 'privat' benutzen können? – Yacoby

+0

Sie könnten aber dann würden sie ein überladenes Wort haben: private Bedeutung verschiedene Dinge :) –

+1

Wiederverwendung Schlüsselwörter klingt in der Tat dumm. Das ist, als würde man 'auto' für verschiedene Dinge benutzen. Oh, warte ... –

3

Ich hänge auf dem ## C++ irc-Kanal auf irc.freenode.net und ich mag die Erklärung auf statisch, dass der Bot nolyc programmiert ist zu geben. Ich zitiere wörtlich:

Wenn innerhalb einer Funktion verwendet, die statische Schlüsselwort gibt an, dass eine Variable geteilt wird zwischen allen der Funktion aufruft. Wenn es innerhalb einer Klasse verwendet wird, zeigt es an, dass die Variable oder die Funktion ein Mitglied ist, aber nicht an eine bestimmte Instanz gebunden ist. Wenn in einem Namespace verwendet wird, gibt es interne Verknüpfung an.

Ich hoffe, dass die Dinge klären. Ich habe nicht alle deine Fragen beantwortet. Ich würde sagen, dass Sie das Schlüsselwort static verwenden sollten, um das zu tun, was es beabsichtigt war. Verwenden Sie es als Werkzeug, um Ihre Aufgabe zu erfüllen, wenn es für den Job die richtige ist. Was die Vorteile angeht, würde ich mir keine Sorgen machen. Wenn Sie optimieren müssen, dann denken Sie über diese Effekte nach, wenn es kein anderes Resort gibt.

Ich hoffe, das hilft.

Verwandte Themen