关于C++中static初始化位置

编译原理作业中关于static的初始化位置问题:

在.h文件中这样声明了一个静态数据成员

 class Expression
{
private:
static std::vector<Identifier> words; //标识符表
//...... public:
static bool hasIdentifier(std::string name);
//......
}

.cpp当中对应的函数如下

bool Expression::hasIdentifier(const string name)
{
unsigned long size = words.size();
for (int i = ; i < size ; i++)
{
if (words[i].name == name)
{
return true;
}
}
return false;
}

当然,编译报错,因为静态数据成员需要初始化。

因为静态数据成员是属于类的,而非静态数据成员是属于对象的;于是,可以理解,一个类的静态数据成员只初始化一次,而非静态数据成员在每次初始化一个对象时都会初始化;所以,通常情况下,静态数据成员的初始化要写在类外,非静态数据成员的初始化写在构造函数中。于是,在.h文件中写了如下代码:

class Expression
{
private:
static std::vector<Identifier> words; //标识符表
//....... public:
static bool hasIdentifier(std::string name);
//......
} std::vector<Identifier> Expression::words;

这样的做法其实是不正确的,在大部分情况下都会编译不通过。这是因为,写在.h文件中的即意味着当出现大于1处的“#include "Expression.h"”时,这个静态数据成员就会初始化一次,这和把初始化语义写在了类里实质是一样的,都是重复地初始化了静态数据成员。

所以,正确的做法是将静态数据成员的初始化放在对应的.cpp文件中。

by 一棵球

上一篇:jqmobi 的一些設置


下一篇:Ubuntu使用之Svn命令小技巧