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

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

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

 1 class Expression
 2 {
 3 private:
 4     static std::vector<Identifier> words;   //标识符表
 5     //......
 6 
 7 public:
 8     static bool hasIdentifier(std::string name);
 9     //......
10 }

.cpp当中对应的函数如下

bool Expression::hasIdentifier(const string name)
{
    unsigned long size = words.size();
    for (int i = 0 ; 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 一棵球

posted @ 2017-03-23 20:09  一棵球和一枝猪  阅读(2073)  评论(0编辑  收藏  举报