2012-08-27 36 views
6

La palabra clave estática está relacionada generalmente con la vinculación interna, pero la palabra clave estática utilizada dentro de una clase tiene una vinculación externa ¿no? Las variables m, n a continuación son accesibles fuera del archivo de clase.palabra clave estática dentro de una clase y fuera de ella

class c { 
    int i; 
    int j; 
    static int m; 
    static int n; 

    public: 
    void zap(); 
    static void clear(); 
}; 
+6

'static' miembros pertenecen a la clase * *; para las variables, son accesibles sin un objeto y se comparten entre instancias, p. 'struct Foo {static void * bar; vacío estático * fu(); } ', por lo que' Foo :: bar' y 'Foo :: fu' son legales. – oldrinb

+0

No es estrictamente requerido por el estándar, pero puede (o no puede) ayudar a pensar en miembros estáticos como estáticos en el sentido de una dirección fija establecida en tiempo de compilación, mientras que los datos de miembros no estáticos pueden colocarse en la pila o heap en varias direcciones determinadas por el tiempo de ejecución. Los miembros 'static' son básicamente como variables globales, excepto que su identificador cae dentro del alcance de la clase que los declara. –

Respuesta

10

Derecha.

static La palabra clave es muy sobrecargado con demasiados significados diferentes:

  • En una variable o función en el ámbito del espacio de nombres que le da al enlace interno nombre.
  • En un miembro de la clase lo convierte en un miembro estático, lo que no afecta al enlace.
  • En una variable en el alcance de la función da a la variable "duración de almacenamiento estático" en oposición a la duración de almacenamiento "automático" o "dinámico" (es decir, la vida útil de la variable se extiende hasta el final del programa, como variables globales)
+1

Los significados que no son de clase son en su mayoría los mismos que en C: http://stackoverflow.com/questions/572547/what-does-static-mean-in-a-c-program –

1

Se podría decir que los miembros estáticos son miembros de la clase y no cualquier instancia de objeto específico. Es decir, tienen el mismo valor para todas las instancias de objetos.

Las funciones de miembro estático, aunque no tienen ningún valor, son las mismas. En lugar de ser únicos para cada instancia de objeto, pueden verse como parte de la clase. Esto significa que no tienen el puntero this y no pueden acceder a variables de miembro no estáticas.

+1

No se dice que las funciones de los miembros tengan un * valor *. ;-) – oldrinb

2

Como dije en my comment, static miembros son los asociados sólo con la clase en lugar de objetos individuales.

static miembros pertenecen a la clase; para las variables, son accesibles sin un objeto y se comparten entre instancias, p.

struct Foo { 
    static void *bar; 
    static void *fu(); 
} 

por lo Foo::bar y Foo::fu son legales.

Se introducen en § 9.4 del estándar C++ 03;

  1. un miembro de datos o la función de una clase puede ser declarado static en una definición de clase, en cuyo caso se trata de un miembro estático de la clase.

  2. Un miembro de statics de clase X puede ser denominado usando el calificado-id expresión X::s; no es necesario utilizar la sintaxis de acceso de miembro de clase (5.2.5) para referirse a un miembro static.Un miembro de static puede ser denominado utilizando la sintaxis acceso miembro de la clase, en cuyo caso se evalúa la objeto-expresión

    class process { 
    public: 
        static void reschedule(); 
    }; 
    process& g(); 
    
    void f() 
    { 
        process::reschedule(); // OK: no object necessary 
        g().reschedule(); // g() is called 
    } 
    

    Un miembro de static puede ser denominado directamente en el alcance de su clase o en el ámbito de una clase derivada (cláusula 10) de su clase; en este caso, el miembro static se conoce como si se utilizó un calificado-id expresión, con el nombre-nested-especificador de la calificado-id nombrar el ámbito de la clase de la que se hace referencia al miembro de static.

    int g(); 
    struct X { 
        static int g(); 
    }; 
    struct Y : X { 
        static int i; 
    }; 
    int Y::i = g(); // equivalent to Y::g(); 
    

    ...

Cuestiones relacionadas