c++中静态成员变量为什么要在类外部再定义?
2013-11-01 14:40
302 查看
今天在编译tvision的Demo时遇到了很多链接错误,后来发现tvision的代码中很多类中声明的静态成员变量没有在类的实现文件中定义导致。
参考这里的讨论:
http://bbs.csdn.net/topics/360126427
问:
能否说说是什么原因?
答:
对于class的static data member,其实只是声明了一个scope(还记得class::static_data_member中的::么?),既然是声明而已,所以还需要一个定义,之所以需要在类的外面,因为本质来说它和global和static变量没什么区别,都是在数据段的,只是scope不一样,属于class而已。
这里反映出了C/C++里面一些稍微偏底层的复杂的细微的概念,比如scope,storage,life time。
::是指scope,是在class里面声明的,static指storage,是和global一样,在外面定义的。
更详细的原因请参考另一篇文章:
/article/5437382.html
参考这里的讨论:
http://bbs.csdn.net/topics/360126427
问:
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一样,在外面定义的。
更详细的原因请参考另一篇文章:
/article/5437382.html
相关文章推荐
- C++静态成员变量为什么在类外部定义?
- c++中静态成员变量要在类外部再定义或初始化的原因
- VC C++中定义静态成员变量后需要在外部初始化,否则出错
- c++中静态成员变量要在类外部再定义或初始化的原因
- c++中静态成员变量要在类外部再定义,否则产生link2001错误
- c++中静态成员变量要在类外部再定义,否则产生link2001错误
- c++中静态成员变量要在类外部再定义,否则产生link2001错误.
- c++中静态成员变量要在类外部再定义,否则产生link2001错误
- c++中静态成员变量要在类外部再定义,否则产生link2001错误
- C++为什么需要定义自己的复制构造函数
- C++中使用类模板定义对象时出现:“error LNK2019: 无法解析的外部符号”的解决办法
- C++ primer学习1:细节:标准化后C++中,定义在for循环内部的变量,循环外部不可使用
- C++为什么没有重复定义错误?
- C++ 类的定义问题,为什么只有const static 整型变量才可以在类中定义并复赋值?
- 为什么在C++使用pthread_create()的时候,类成员函数做线程的处理函数必须要定义成static类型的?
- 简单讲解C++的内部和外部函数以及宏的定义
- C++析构函数为什么要定义成虚函数
- C++中模板定义与声明为什么放在同一个文件中
- C++中inline函数的定义为什么要放在头文件中?头文件中“只定义一份”是什么意思?const object 和inline函数是“一次定义规则”
- C++类内为什么不能定义非const的static成员(待续)