Question

Désolé si cette question semble banale pour beaucoup ici.

Dans un code C ++, il existe quelque chose comme ci-dessous:

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

}//class definition ends

int Foo::bands; //Note: here its not initialized to any value!
  1. Pourquoi l'énoncé ci-dessus est-il nécessaire à nouveau lorsque "bandes" a déjà été déclaré dans la classe comme étant statique?

  2. Une variable statique peut-elle également être déclarée en tant que variable membre privée dans une classe?

Était-ce utile?

La solution

C ++ note une distinction entre déclarant et définissant . bandes est déclaré dans la classe, mais n'est pas défini.

Un membre de données non statique serait défini lorsque vous définissez un objet de ce type, mais comme un membre statique ne fait pas partie d'un objet spécifique, il a besoin de sa propre définition.

Autres conseils

a) C'est nécessaire parce que c'est ainsi que la langue est conçue.

b) Les variables statiques sont initialisées par leur constructeur par défaut ou à zéro pour les types intégrés.

c) Oui, ils peuvent être (et sont généralement) privés.

Jetez un coup d'œil à cette question.

Cela concerne les fichiers obj, leur utilisation et la manière dont les adresses mémoire des variables globales sont finalement découvertes au cours du processus de liaison. Les fichiers objet contiennent les adresses de toutes les données et fonctions globales définies dans le cpp correspondant. Ils agencent une certaine quantité de mémoire de manière relative pour indiquer à l’utilisateur similaire où se trouvent ces fichiers vars / funcs globaux. Ainsi, par exemple

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

Il est presque plus facile d’y penser si vous avez déjà joué au C directement. Dans un monde C pur, vous feriez les choses dans un sens de programmation modulaire plus traditionnel. Votre module serait défini avec un en-tête et un cpp. L'en-tête définirait un "public" comme ci-dessous, en utilisant le mot-clé extern, puis instanciez-le dans cpp.

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

Le " extern " mot-clé indique que ce nom est valide et que son adresse sera résolue au moment de la liaison. Tous ceux qui ont inclus " foo.h " et souhaitait utiliser les "bandes". variable globale avait peut maintenant l'utiliser. Au moment de la liaison, l'éditeur de liens découvrirait que des bandes existaient déjà dans le fichier foo.obj. Si vous avez oublié de mettre les "int band" dans foo.obj, vous obtiendrez une erreur de l'éditeur de liens et devrez la résoudre.

En C ++, l'utilisation de static dans une déclaration de classe est similaire. Vous dites aux utilisateurs qu’il existe un élément appelé "foo :: bands". et où il vivra sera résolu au moment du lien. Plus tard dans la ligne, l’éditeur de liens s’aperçoit que dans foo.obj, foo :: bands existe et que toutes les références à foo :: bands peuvent être résolues.

D'après ce que j'ai compris, vous n'auriez besoin de déclarer Foo :: bands que si vous aviez prévu de l'utiliser avant de créer une instance de votre classe. Fondamentalement, lorsque vous déclarez une valeur statique dans une classe C ++, une seule copie de cette variable existe pour toutes les instances de cette classe. Cependant, vous ne pouvez normalement pas accéder à Foo :: bands tant qu'une instance de la classe n'est pas déclarée.

Par exemple:

Pointeurs vers les membres

#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);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top