首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++中静态成员变量为什么要在类外部再定义?否则产生link2001异常

2012-10-07 
c++中静态成员变量为什么要在类外部再定义?否则产生link2001错误class testClass{public:static int m_i}

c++中静态成员变量为什么要在类外部再定义?否则产生link2001错误
class testClass
{
public:
static int m_i;
};


int testClass::m_i;
//类外部定义,若不写会产生error LNK2001: unresolved external symbol "public: static int testClass::m_i" (?m_i@testClass@@2HA)


int main(int argc, char* argv[])
{
printf("%d\n",testClass::m_i);
printf("\n");
return 0;
}


能否说说是什么原因?

[解决办法]
因为在类的定义中仅仅对静态数据成员进行引用性说明,所以必须在文件作用域的某个地方用类名限定进行定义,这时也可以进行初始化。
[解决办法]
对于class的static data member,其实只是声明了一个scope(还记得class::static_data_member中的::么?),既然是声明而已,所以还需要一个定义,之所以需要在类的外面,因为本质来说它和global和static变量没什么区别,都是在数据段的,只是scope不一样,属于class而已。

这里反映出了C/C++里面一些稍微偏底层的复杂的细微的概念,比如scope,storage,life time。
::是指scope,是在class里面声明的,static指storage,是和global一样,在外面定义的。

[解决办法]
参考这篇文章:
特殊数据类型成员变量的初始化

应该可以很好地解答楼主的问题。
[解决办法]
虽然是成员变量,但是,静态变量都是和全局变量在同一存储区存储的,程序初始化的时候它需要对该变量做初始化。
所以静态变量表现的就跟全局变量一样,需要在类外定义。
[解决办法]

探讨

对于class的static data member,其实只是声明了一个scope(还记得class::static_data_member中的::么?),既然是声明而已,所以还需要一个定义,之所以需要在类的外面,因为本质来说它和global和static变量没什么区别,都是在数据段的,只是scope不一样,属于class而已。

这里反映出了C/C++里面一些稍微偏底层的复杂的细微的概念,……

[解决办法]
静态变量都是和全局变量都是在数据段分配内存,所以静态变量就跟全局变量一样,需要在类外定义。

热点排行