const static class member问题
热门软件下载:
<<ec中文版>>p14,给了一个例子:
class gameplayer {
static const int num_turns = 5;
int scores[num_turns];
//.......
};
并且说:“以上所见的只是num_turns的一个声明而非定义。你还必须在程序文件中定义static class memebers:
const int gameplayer::num_turns;//class专属常量的定义应该放在class的实现文件中
”
****我的疑问****:
1、好象不是“必须在程序文件中定义”把,我将.h文件中放class的声明,.cpp文件中没有放定义也是可以的。
2、(不只是在类中)为什么static变量在声明的时候一定要加,在定义式就不需要加了(如果已经声明)?
我是菜鸟,大虾请指点...
推荐阅读
呵呵,这是c++标准的规定,没有必要细究理由。事实上许多编译器已经去掉了这个规定。
1。好象不是“必须在程序文件中定义”把,我将.h文件中放class的声明,.cpp文件中没有放定义也是可以的。
"必须在程序文件中定义"这句话所说的“程序文件”,并不是单指cpp;.h也是“程序文件”
2。"声明"中的那个static不可省略,因为省略了static,它就不在仅仅是decleare,而是
declear+define了。因为默认是的是class的普通成员。
我的意思是,const static class member为什么规定要一定要定义呢??
//任何一个你使用的变量都要定义
//区分定义和声明
//比如:
//void fun(void); //声明
而
//void fun(void)
// { }//定义
第二问是问:
为什么声明的时候加static,定义的时候不加,
//你已经声明过了,
声明+定义的时候也要加..????
//你必须声明
1、好象不是“必须在程序文件中定义”把,我将.h文件中放class的声明,.cpp文件中没有放定义也是可以的。
*****************************************
iso c++ 98 标准中规定:
对于class中的 static const int member 可以在声明的同时赋初值,也可以分开赋初值.
vc6.0中不能在声明的同时赋初值.
2、为什么static变量在声明的时候一定要加,在定义式就不需要加了?
**********************************************
声明时之所以要加static,是因为static const int i;与const int i;含义大不相同.
定义时只所以不加satic,是因为:
1.声明时已加了static
2.static member是external linkage,而普通的全局static 变量是interal linkage,如果在定义是再加一个static,两种linkage含义相矛盾,所以标准中规定定义是不能加static;
3.const 非class member 变量也是interal linakge,为什么在static const int class member定义是却要加上const?难道不怕出现两种linkage含义相矛盾?
对,不用担心.因为:虽然 const 非class member 变量是interal linakge,但如果有该const 变量定义所在的编译单位之外的模块声明引用该const 变量,那么,这相const 变量就不再interal linkage了,也就是说也是外面可见的了.区分const 变量的声明与定义这样做:
const int i = 10; //定义:
声明:
extern const int i; // 声明;
所以:static const int member 在class中完整的写法应该这样:
class test {
extern static const int i; //但这样写是没有必要的,因为编译知道这是在声明,而不是在定义
}
const int test::i = 10;
补充:
2、为什么static变量在声明的时候一定要加,在定义式就不需要加了?
**********************************************
因为只有static class member 才需要定义,非static member不需要也不可以定义,所以,在定义static class member时不需要加上"static"---编译器知道这是也只能是static class member.
相关评论