现在的位置: 首页 > 综合 > 正文

类的静态成员变量

2014年01月30日 ⁄ 综合 ⁄ 共 1171字 ⁄ 字号 评论关闭

内存分配方式有三种:  
  
 (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。  
  
 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。  
  
 (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 

类的静态成员变量和函数中的静态变量一样,在编译的时候就分配内存了,直到程序退出才释放,并不是随着对象的删除而释放的:

 

 

 

因为类的静态成员变量是所有实例共用的.所以得在类外初始化.

调用的时候可以通过对象调用,也可以通过类直接调用

class A
{
public:
    
int i;    //有默认值
};
class B
{
public:
    
static int n;
    static A Aobj;
};

int B::n = 1;    //静态成员变量的初始化
A B::Aobj;       //静态成员变量的初始化(实例化)

void main()
{
    B Bobj;
    printf(
"B::n=%d Bobj.n=%d Bobj.Aobj.i=%d/n", B::n, Bobj.n, Bobj.Aobj.i);
}

私有的静态成员变量也是放在类外初始化的.这看起来跟它的私有属性不相符.

再做下面的测试,发现了一个有趣的现象.

 

class B
{
    
static int i;
public:
    B(){i
=3;};    //把这行注释掉,输出变成0
    int p(){return i;};
};

int B::i = 2;      //把这行注释掉,编译报错

void main()
{
    B Bobj;
    printf(
"private: static int B::i=%d/n", Bobj.p());    //输出3
}

这样看来.类外的初始化那一行根本没有起到初始化的作用.它赋的值根本没用.(对私有静态成员变量是这样.公有的还是有作用的)

于是我的理解是:

静态成员变量的定义一共包括两个部分.

像函数一样,要先在类中声明,然后再找个地方实现.静态成员也要先在类中声明了,再到类外"实现"一下.

只是私有的静态成员在类外是不可访问的.于是在类外的赋值语句将不起作用,只起到一个"实现"的作用.

 

 

我的理解:私有的静态成员变量在编译 的时候就已经为其分配好内存了,并为其初始化,当用类定义对象的时候,就会调用类的构造函数重新给静态成员变量赋值。

 

抱歉!评论已关闭.