Verwendung von das statische Schlüsselwort in C++
-
Verwenden Sie das Schlüsselwort
static
, um Variablen mit statischer Dauer in C++ zu deklarieren -
Verwenden Sie das Schlüsselwort
static
, um statische Member einer Klasse in C++ zu deklarieren
In diesem Handbuch werden verschiedene Methoden zur Verwendung des Schlüsselworts static
in C++ erläutert.
Verwenden Sie das Schlüsselwort static
, um Variablen mit statischer Dauer in C++ zu deklarieren
Mit dem Schlüsselwort static
können lokale Variablen mit statischer Dauer deklariert werden. Im Gegensatz zu dem, was die Benennung vermuten lässt, bedeutet eine lokale Variable mit statischer Dauer, dass ihr Wert im Speicher aktiv bleibt, auch nachdem der Block, in dem die Variable deklariert wurde, den Gültigkeitsbereich verlässt.
Grundsätzlich können diese lokalen Variablen ihre Werte zwischen den Funktionsaufrufen gespeichert haben, wo sie definiert werden. Beachten Sie, dass die Funktion incrementCount
eine Variable namens count
hat, die mit dem Wert 0
initialisiert wird. Das Attribut count
wird dem Speicherbereich zugewiesen, der bis zum Beenden des Programms aktiv ist. Somit fügt jeder Aufruf von incrementCount
der gegebenen Ganzzahl eine einzelne Einheit hinzu.
#include <iostream>
using std::cout;
using std::endl;
int incrementCount() {
static int count = 0;
return ++count;
}
int main() {
for (int i = 0; i < 20; ++i) {
if (i % 2 == 0) incrementCount();
}
cout << incrementCount() - 1 << endl;
return EXIT_SUCCESS;
}
Ausgabe:
10
Verwenden Sie das Schlüsselwort static
, um statische Member einer Klasse in C++ zu deklarieren
Andererseits wird das Schlüsselwort static
verwendet, um statische Datenelemente der Klasse zu deklarieren. Diese Member sind dem Klassentyp selbst und nicht den einzelnen Instanzen der Klasse zugeordnet. Wenn wir also ein statisches Datenelement für eine bestimmte Klasse definieren, hat jede Instanz dieses Klassentyps denselben Wert für das Datenelement. Im Gegensatz zu einem privaten Mitglied hat das erstere eine einzige Kopie im Speicher. Das letztere Merkmal macht statische Datenmember vom Standpunkt des Klassenspeicherbedarfs aus effizient.
Die statischen
Datenelemente werden anders definiert und initialisiert als normale Datenelemente. Die statischen
Member sollten innerhalb der Klasse deklariert und ausserhalb der Klasse in der zugehörigen Quelldatei definiert werden. Das Schlüsselwort static
wird nur in der Deklaration innerhalb der Klasse verwendet. Keines der statischen
Datenmember kann von den Konstruktoren initialisiert werden, und sie können nicht innerhalb des Klassenkörpers initialisiert werden, es sei denn, sie haben einen ganzzahligen Typ const
. Die letztgenannten Typen müssen noch außerhalb des Klassenrumpfs ohne eine Anfangswertangabe definiert werden. Das folgende Beispiel demonstriert die einfache Verwendung für das statische
Datenelement name
, das mit dem String-Literal initialisiert und später mit der Funktion setNewName
modifiziert wird.
#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class MyClass1 {
private:
static string name;
string nickname;
public:
explicit MyClass1(string n) : nickname(std::move(n)){};
static string getName() { return name; }
static void setNewName(std::basic_string<char> s) { name = std::move(s); }
string getNickname() { return nickname; }
~MyClass1() = default;
};
string MyClass1::name = "Static name";
int main() {
MyClass1 m1(string("April"));
MyClass1 m2(string("Maude"));
cout << MyClass1::getName() << endl;
MyClass1::setNewName("New name");
cout << MyClass1::getName() << endl;
return EXIT_SUCCESS;
}
Ausgabe:
Static name
New name
Alternativ kann die Klasse die statischen
Funktionsmember haben, die an kein Objekt gebunden sind und daher nicht auf das this
-Objekt in ihren Körpern verweisen können. Im Allgemeinen brauchen diese Funktionen keine separate Deklaration und Definition ähnlich den statischen
Datenmembern, wie im folgenden Beispielprogramm gezeigt. Dennoch erfordern die meisten zeitgenössischen Styleguides normalerweise, dass der Programmierer die beiden von ihnen entkoppelt.
#include <iostream>
#include <string>
#include <utility>
using std::cin;
using std::cout;
using std::endl;
using std::string;
class MyClass1 {
private:
static string name;
string nickname;
public:
explicit MyClass1(string n) : nickname(std::move(n)){};
static string getName() { return name; }
static void setNewName(std::basic_string<char> s) { name = std::move(s); }
string getNickname() { return nickname; }
static bool compareStrings(const std::basic_string<char>& s1,
const std::basic_string<char>& s2) {
if (s1 == s2)
return true;
else
return false;
}
~MyClass1() = default;
};
string MyClass1::name = "Static name";
int main() {
MyClass1 m1(string("April"));
MyClass1 m2(string("Maude"));
MyClass1::compareStrings(m1.getNickname(), m2.getNickname())
? cout << "strings are equal" << endl
: cout << "strings are not equal" << endl;
MyClass1::compareStrings(MyClass1::getName(), MyClass1::getName())
? cout << "strings are equal" << endl
: cout << "strings are not equal" << endl;
return EXIT_SUCCESS;
}
Ausgabe:
strings are not equal
strings are equal
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook