静态类型及其初始化

来源:互联网 发布:python 3d游戏引擎 编辑:程序博客网 时间:2024/06/04 18:50

在C语言中有静态数据类型,声明一个静态数据类型意味着:该变量的生存周期是

静态的,即在程序的开始即分配到程序,终止时才释放。在C++中,声明一个类的静态数据成员意味着所有的实例只有该数据成员的一个拷贝。

《深入浅出MFC》这样解释:

Static 成员不属于对象的一部分,而是类的一部分。所以程序可以在没有诞生对象的时候就处理此种成员变量.但必须首先初始化它。

不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一

再被调用,而变量的初值只应该设定一次,也有可能该类并没有初始化的时候就已经用到了该静态成员。也不要把初始化操作安排在头文件中,

因为它可能被载入到许多地方,因此就可能执行许多次。你应该在应用程序文件中,

类以外的任何地方设定其初始值。通常在程序实现文件中对其进行初始化,或者全局函数中,或任何函数之外:

//示例程序

//一般情况下静态类型的初始化样例

// test.h
class A
{
public:
    A();
    ~A() { delete ptr;}
    static A* ptr;
    static bool Isture;
    static int  number;
public:
    struct B
    {
      static bool test_B;
      static int  test_number;
    };
    B b_obj;
};
//test.cpp

A* A::ptr = NULL;
bool A::Isture = true;
int  A::number = 0;
bool A::B::test_B = false; //注意此处,即静态变量的初始化只和类有关,和对象无关
int  A::B::test_number = 0;
A::A()
{
    //........
}

设定static成员变量初值时,不受任何存取权限的束缚。请注意,static成员变量的类型也出现在初值设定中,因为这是一个初值设定操作,不是一个赋值(assignment)操作。事实上,staic变量在这个时候(而不在类声明中)才定义出来。如果你没有做这个初始化操作,会产生连接错误。下面是存取static成员变量的一种方式,注意,此刻还没有任何对象实例:

//第一种存取方式:

void main()

{

SavingAccount::m_rate = 0.0075; //欲此成立,须把m_rate改为public

}

下面是这种情况则是产生一个对象后,通过对象来处理static成员变量:

//第二种存取方式:

void main()

{

SavingAccount myAccount;

myAccount.m_rate = 0.0075; //欲此成立,须把m_rate改为public

}

Static成员变量并不是因为对象的实现才得以存在的,它本来就存在,你可以想象

它是一个全局变量。只要access level允许,任何函数都可以存取static成员变

量。但是如果你希望在产生任何对象之前就存取其class的private static成员

变量,则必须设计一个static成员函数:

由于static成员函数不需要借助于任何对象,就可以被调用,所以编译器不会为它

暗加一个this指针。因此static成员函数无法处理类之中的non-static成员变量。