这代码类递归定义问起

class test
{
public:
static int geta()
{
return a.b;
}
private:
int b=1;
static test a;
};
test test::a; //去掉这句报错
int main()
{

cout <<test::geta();

return 0;
}
这是为啥。。。还能输出1,但是注释那句就报错了

因为是private,所以不能直接访问a,你加上的那句的a和static a是两个不同的变量,虽然名字 一样。

test test::a; 这句话起的作用是分配内存。定义了一个static test a对象,这个对象中有一个整数b,值为1.
如果没有这句话,那调用geta(),其中的a是没有被分配内存的,这是不允许的,肯定会报错。

定义了对象 没有分配内存是访问不了的

就想人类只是个定义 只有到具体的人才可以有行动 有属性

虽然定义了静态对象 但是没有给对象分配内存时 它还是不存在的

你在类中申明了一个类的静态成员变量,静态成员变量需要在类的外部定义它。

test::a是静态成员,必须在类外进行初始化。因为test是类,初始化及是类的实例化,分配内存。函数geta是静态函数,可以使用类型进行访问

首先,你定义了一个 test类,类里除了一个 b,还有一个 静态test类 a;
而这个a,得在test类外声明,所以有了要去掉的那一句话( 声明一个test 类的 a,这个a 的定义在 test类中);
去掉了 就没声明,没了声明,自然找不到a, 最后得出错误 error LNK2001: 无法解析的外部符号 "private: static class test test::a"

static 类型的成员变量本身是不会影响类的sizeof大小的,它在第一次使用的时候才会被系统分配存储空间,之后再次使用不会分配存储空间。去掉注释的那句,a在整个程序中都未被使用,即a.b也是没有存储空间的。回答完毕,不懂可以探讨。

a是静态成员,需要再类外定义它。