Verwendung von das statische Schlüsselwort in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie das Schlüsselwort static, um Variablen mit statischer Dauer in C++ zu deklarieren
  2. Verwenden Sie das Schlüsselwort static, um statische Member einer Klasse in C++ zu deklarieren
Verwendung von das statische Schlüsselwort in C++

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
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Verwandter Artikel - C++ Static