zoukankan      html  css  js  c++  java
  • 关于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 一棵球

  • 相关阅读:
    STL中的string
    STL中的map
    STL中的set和multiset
    C++基础知识
    希尔排序
    桶排序
    归并排序
    堆排序
    数组左边奇数右边偶数算法O(n)
    背包问题 洛谷P1164 小A点菜
  • 原文地址:https://www.cnblogs.com/chunzhulovefeiyue/p/6607066.html
Copyright © 2011-2022 走看看