Pregunta

Lo siento si esta pregunta parece trivial para muchos aquí.

En un código C ++ hay algo como abajo:

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

}//class definition ends

int Foo::bands; //Note: here its not initialized to any value!
  1. ¿Por qué se necesita nuevamente la declaración anterior cuando una vez se declara 'bandas' dentro de la clase como estática?

  2. ¿También se puede declarar una variable estática como una variable miembro privada en cualquier clase?

¿Fue útil?

Solución

C ++ señala una distinción entre declarar y definiendo . bands se declara dentro de la clase, pero no se define.

Un miembro de datos no estáticos se definirá cuando defina un objeto de ese tipo, pero como un miembro estático no es parte de ningún objeto específico, necesita su propia definición.

Otros consejos

a) Se necesita porque esa es la forma en que está diseñado el languge.

b) Las variables estáticas se inicializan por su constructor predeterminado, o en cero para los tipos incorporados.

c) Sí, pueden ser (y generalmente son) privadas.

Echa un vistazo a esta pregunta.

Tiene que ver con los archivos obj, cómo se usan y cómo las direcciones de memoria para las variables de alcance global se descubren en última instancia a través del proceso de vinculación. Los archivos de objetos contienen las direcciones de todos los datos globales y funciones definidas en el cpp correspondiente. Diseñan algo de memoria de manera relativa para indicar al usuario dónde se encuentran estas funciones / funciones globales. Así, por ejemplo,

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 casi más fácil pensar si has hecho C directamente. En un mundo C puro, harías las cosas en un sentido de programación modular más tradicional. Tu módulo se definiría con un encabezado y un cpp. El encabezado definiría un " público " variable como la que se muestra a continuación, utilizando la palabra clave externa, luego cree una instancia en el 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

El " extern " la palabra clave indica que este nombre es válido y su dirección se resolverá en el momento del enlace. Todos los que incluyeron " foo.h " y quería usar las " bandas " Ahora la variable global podía usarla. En el momento del enlace, el enlazador descubrirá que las bandas existían en el foo.obj. Si olvidó poner " int bandas " en foo.obj, obtendrías un error de vinculador y deberías resolverlo.

En C ++ usando estática en una declaración de clase i similar. Le está diciendo a los usuarios que existe esta cosa llamada " foo :: bands " y donde vivirá se resolverá en el momento del enlace. Más adelante en la línea, el enlazador ve que en foo.obj, foo :: bands existe, y todas las referencias a foo :: bands pueden resolverse.

Tengo entendido que solo necesitarías declarar Foo :: bands si planeaste usarlo antes de crear una instancia de tu clase. Básicamente, cuando declara una estática en una clase de C ++, solo existe una copia de esa variable para todas las instancias de esa clase. Sin embargo, normalmente no puede acceder a Foo :: bands hasta que se declare una instancia de la clase.

Por ejemplo:

Punteros a los miembros

#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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top