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

static

2013年08月15日 ⁄ 综合 ⁄ 共 1279字 ⁄ 字号 评论关闭

const一样,staticc++中比较特殊的关键字之一。static的许多特性都会在平常的程序编写中体现出来,不弄明白它的深刻含义就会在程序编写和调试的过程中出现许多莫名其妙的问题。

存在区间与初始化

    static修饰的变量比较特别的一点是:若该变量是类成员变量或函数,则其在main函数被初始化以前就会存在,直至程序进程的结束;若是函数中的局部变量或函数,则会在当函数被调用时初始化,存在至程序进程结束。注意,无论是哪种static变量或函数,无论其所在的类会被构造几个或是所在的函数会被调用几次,都不会产生副本。

可见范围

    static修饰符能够限制变量的可见范围。函数中的static变量虽然在函数被调用后就会存在,但是在函数外是不可见的;一个编译单元中的static变量在编译单元外是不可见的;在类中的static变量的可见性则和普通成员变量一样,受到public等修饰符限制。

类中的static

    当类成员变量是static变量时,只有被const修饰的内建integral types才能在类内初始化,否则都要在类外部初始化。前面也说到了,static的类成员变量在main函数初始化以前就存在了,所以当其属性是public时,可以在程序中通过“类名::static变量名”的方式访问,勿须在此之前产生该类的对象。值得注意的一点是,若是定义了一个static的成员函数,那么这个函数也可以在对象产生前被调用,但是也正因为如此,该函数不会含有隐式的参数this,于是也不能处理非static的成员变量,同样也不能调用非static的成员函数。

static object

static objectstatic修饰符没有必然的联系,它指的是一个一旦被创建就会存在到程序退出的object。因此,stackheap中的object都被排除了。而static object又分为non-local static objectlocal static object。其中,local static object只是包括函数中用static修饰符修饰的object,而non-local static object则包括全局objects,在名词空间范围的objects,类中用static修饰符修饰的objects。值得注意的是,不同的编译单元中的non-local static object的初始化顺序是没有定义的,所以不能用一个编译单元中的某个non-local static object去初始化另一个编译单元中的non-local static object,示例如附录代码所示。


附录代码:

//door.h

class door{

public:

    int open(){…} const;

   

};

 

Extern door tdr;

 

 

//house.h

class house{

public:

   

    house{

   

    int iopen = tdr.open();

    … }

   

};

 

house ths;//这一步使用了tdr来初始化ths。所以行为是没有定义的。

抱歉!评论已关闭.