随笔 - 55  文章 - 15  trackbacks - 0
<2012年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

常用链接

留言簿

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

全局情况下: 限制标识符为内连接,其他编译单元不可见
局部变量时: 声明此变量在其他编译单元中定义

静态成员的初始化表达式在一个类的作用域中:
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 阅读(190) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理