variable initialize c++ static scope static-methods

initialize - ¿Por qué una función miembro estática_declared_ estática, pero_defined_ de lo contrario en C++?



static variable java (1)

La razón detrás es el espíritu de C ++ para intentar minimizar el número de sus palabras clave y mantener la compatibilidad hacia atrás con C: static en esa posición tiene un significado completamente diferente.

Todas las funciones anteriores a C. Las funciones "estáticas" en C son funciones exclusivas de una unidad de compilación (un archivo .c). No se puede acceder a ellos por otras unidades de compilación (es una forma de tener encapsulación en C). Este uso sigue siendo válido en C ++. También puede hacer lo mismo con las variables globales para limitar su alcance.

Sin embargo, en C ++ también desea declarar las funciones miembro como static por una razón diferente: esas funciones pertenecen a la clase pero no requieren una instancia de dicha clase para ejecutarse (apuesto a que ya lo saben, solo estoy intentando completarlas) .

Definir una función miembro como static conduciría a una contradicción: se debe acceder a esa función fuera de su unidad de traducción.

Existe otro caso de reutilización de palabras clave entre C y C ++, la palabra clave auto en C ++ 11, pero es menos probable que sea un problema.

Nota: Lo mismo sucede con la palabra clave virtual que está presente en la declaración y no con la definición.

Aquí hay un ejemplo de trabajo mínimo:

Ah

class A{ static int a_member_function(); };

A.cpp

#include "A.h" int A::a_member_function(){return 5;} int main(){ return 1;}

Este código compila y corre, pero me parece que:

static int A::a_member_function(){return 5;}

se podría usar con la misma facilidad para definir la función miembro estática de la clase A. De hecho, parece que podría ser bastante útil tener este requisito, ya que le recordaría al lector el archivo .cpp que a_member_function es estático.

Sin embargo, esto claramente no funciona:

error: cannot declare member function ‘static int A::a_member_function()’ to have static linkage [-fpermissive]

Entonces, ¿ por qué no funciona? ¿Cuál es el razonamiento detrás de esta decisión?