最近读代码的时候发现有这种编码方式class CA
{
public:
static int Calc(int a, int b); static int a;
static int b;
};int CA::Calc(int a, int b)
{
return a + b;
}
调用的时候:void FuncShit()
{
CA::a = 1;
CA::b = 2;
int answer = CA::Calc(CA::a, CA::b);
}
我就不解了,如果说用void Func()
{
CA* p = new CA();
p->a = 1;
p->b = 2;
int answer = p->Calc(p->a, p->b);
}这样的方式我能够理解,毕竟CA是经过实例化的,成员变量也有分配内存什么的,
可是光是使用::符号,如何理解呢?
{
public:
static int Calc(int a, int b); static int a;
static int b;
};int CA::Calc(int a, int b)
{
return a + b;
}
调用的时候:void FuncShit()
{
CA::a = 1;
CA::b = 2;
int answer = CA::Calc(CA::a, CA::b);
}
我就不解了,如果说用void Func()
{
CA* p = new CA();
p->a = 1;
p->b = 2;
int answer = p->Calc(p->a, p->b);
}这样的方式我能够理解,毕竟CA是经过实例化的,成员变量也有分配内存什么的,
可是光是使用::符号,如何理解呢?
既然只有一份,那么就可以预先分配出来(编译的时候),那么用的时候,由于已经分配,自然就不需要new了。
类中的成员 由于是静态 所以就是全局的,因此就只有一份,可是这个CA的存在方式呢?
肯定有一块内存区域吧?这块内存对所有调用者都是同一份么?
绝个例子吧,
调用CA::xxxx的时候,如果是来自a.cpp和b.cpp两个文件,这个CA是不是同一个呢?还是没一个文件各自拥有一块CA内存块副本啊?
静态数据存放在exe的静态数据区。