Frage

Entschuldigung, wenn diese Frage hier für viele trivial erscheint.

In einem C ++ - Code gibt es etwas wie unten:

class Foo
{
public:
   static int bands;
   ...
   ...
private:
   ...
   ...

}//class definition ends

int Foo::bands; //Note: here its not initialized to any value!
  1. Warum wird die obige Aussage erneut benötigt, wenn 'Bänder' einst in der Klasse als statisch deklariert wird?

  2. Kann auch eine statische Variable als private Mitgliedsvariable in einer Klasse deklariert werden?

War es hilfreich?

Lösung

C ++ stellt eine Unterscheidung zwischen fest deklarieren und Definition. bands wird innerhalb der Klasse deklariert, aber nicht definiert.

Ein nicht statisches Datenmitglied wird definiert, wenn Sie ein Objekt dieses Typs definieren, aber da ein statisches Mitglied kein Teil eines bestimmten Objekts ist, benötigt es seine eigene Definition.

Andere Tipps

A) Es ist erforderlich, weil die Sprache so gestaltet ist.

b) statische Variablen werden durch ihren Standardkonstruktor initialisiert oder für integrierte Typen auf Null.

c) Ja, sie können (und sind normalerweise) privat sein.

Sich ansehen diese Frage.

Es hat mit OBJ -Dateien zu tun, wie sie verwendet werden und wie Speicheradressen für global Scoped -Variablen letztendlich durch den Verknüpfungsprozess entdeckt werden. Objektdateien enthalten die Adressen aller im entsprechenden CPP definierten globalen Daten und Funktionen. Sie layern einen Gedächtnis relativ, um dem LIGER mitzuteilen, wo in dieser Datei diese globalen VARs/Funcs gefunden werden können. Also zum Beispiel

function doFoo can be found 0 bytes from beginning of this file
int foo::bands can be found 12 bytes from beginning of this file
etc

Es ist fast einfacher, darüber nachzudenken, ob Sie schon einmal C C gemacht haben. In einer reinen C -Welt würden Sie Dinge in einem traditionelleren modularen Programmiersinn tun. Ihr Modul würde mit einem Header und einem CPP definiert. Der Header würde eine "öffentliche" Variable wie unten unter Verwendung des externen Schlüsselworts definieren und dann in der CPP instanziieren.

foo.h

extern int bands; 

foo.cpp

#include "foo.h"
int bands;

foo.obj:

int bands can be found 0 bytes from the beginning of this file

Das Schlüsselwort "extern" besagt, dass dieser Name gültig ist und seine Adresse zum Verknüpfungszeitraum gelöst wird. Jeder, der "foo.h" enthielt und die globale Variable "Bands" verwenden wollte, konnten sie jetzt verwenden. Zur Linkzeit die Linker würde herausfinden, dass im Foo.obj Bänder existierten. Wenn Sie vergessen haben, "int Bands" in foo.obj zu setzen, erhalten Sie einen Linker -Fehler und müssen ihn lösen.

In C ++ Verwenden von static in einer Klassenerklärung i ähnlich. Sie sagen den Benutzern, dass es dieses Ding namens "Foo :: Bands" gibt und wo es leben wird, wird zur Linkzeit gelöst. Später auf der ganzen Linie sieht der Linker, dass Foo :: Bands in Foo.obj existiert und alle Verweise auf Foo :: Bands gelöst werden können.

Mein Verständnis ist, dass Sie nur Foo :: Bands deklarieren müssten, wenn Sie es vor der Erstellung einer Instanz Ihrer Klasse planen möchten. Wenn Sie in einer C ++ - Klasse eine statische Erklärung deklarieren, gibt es für alle Instanzen dieser Klasse nur eine Kopie dieser Variablen. Normalerweise können Sie jedoch erst auf Foo :: Bands zugreifen, wenn eine Instanz der Klasse deklariert ist.

Zum Beispiel:

Zeiger auf Mitglieder

#include <iostream>
using namespace std;

class X {
public:
  int a;
  void f(int b) {
    cout << "The value of b is "<< b << endl;
  }
};

int main() {

  // declare pointer to data member
  int X::*ptiptr = &X::a;

  // declare a pointer to member function
  void (X::* ptfptr) (int) = &X::f;

  // create an object of class type X
  X xobject;

  // initialize data member
  xobject.*ptiptr = 10;

  cout << "The value of a is " << xobject.*ptiptr << endl;

  // call member function
  (xobject.*ptfptr) (20);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top