全局情况下: 限制标识符为内连接,其他编译单元不可见
局部变量时: 声明此变量在其他编译单元中定义
静态成员的初始化表达式在一个类的作用域中:
int x = 100;
class WithStatic
{
static int x;
static int y;
};
int WithStatic:: x = 1;
int WithStatic:: y = x +1;
int main()
{
WithStatic ws;
return 0;
} 上例中,WithStatic:: x = 1; WithStatic:: y = 2;原因是:WithStatic::限定符把WithStatic的作用域扩展至全部定义中。
如果下面再添加一个全局变量int y = x + 1;那么y = 101;
另外,静态数据变量的初始化(定义)是在类外的,而且只定义一次。
但是static const又稍稍有些不同
1. 内建数据类型可以在类内定义,也可以在类外定义。
2. 内建数据类型数组必须在类外定义。
3. 自定义类型并须在类外定义。
例:
class Test
{
static int i = 1;// illegal! only static const integral data members can be initialized within a class
static const int y = 1;// right
static const int z[];
static const int q[] = {1, 2, 4};//illegal
};
const int Test::z[] = { 1, 2, 3}; 内建类型同样要在类外定义:
class X
{
int i;
public:
X(int ii):i(ii)
{}
};
class test
{
//This doesn't work, although you want it to:
static const X x(100);// illegal, both const and non-const static class objects must be initialized externally:
static X x2;
static X xTable2[];
static const X x3;
static X xTable3[];
};
X test::x2(100);
X test::xTable2[]={
X(1), X(2)};
const X test::x3(100);
const X test::xTable3[]={
X(1), X(2)};
int main()
{//
return 0;
}
究其原因,我觉得是因为这个静态变量属于类,而不属于对象,所以,不能在创建这个对象的时候初始化它,那样就会在栈中为这个变量分配内存,而不能成为静态变量。所以必须不是在创建对象的时候初始化,而应该是在连接器知道这个类的时候,这个静态成员就应该创建好了。为什么不是编译器而是连接器呢,我也不知道了。。。编译原理没看过,先用着。
补充:
静态数据成员可以放在嵌套类中,但是不能放在局部类中,我认为原因是每次调用该函数时,都需要压栈操作,然而一个类中的静态变量也要放在栈上,这样就不被允许了。
2. 静态成员函数不能为const(为什么?)
细看const成员函数的定义:不会修改该对象的数据成员。
我们知道,访问成员函数时会自动带上this,形如CTest::SetColor(int color),会自动转换成CTest::SetColor(CTest* this, int color)。
在const成员函数时,实际转换成了CTest::SetColor(const CTest* this, int color)。
this指向的是一个const对象,const对象的数据成员是不能改变的。
而静态成员函数实际上是一个全局函数,没有this指针,根本不会访问到对象的数据成员,在此使用const就多此一举了。
posted on 2012-04-09 14:09
Dino-Tech 阅读(201)
评论(0) 编辑 收藏 引用