静态成员变量

时间:2014-06-06 20:55:31

标签: c++

我开始使用C ++进行面向对象编程,而且我遇到了静态成员变量。

在我的特定情况下,我的头文件(Class.hpp)中有以下内容:

private:
    const static string DEFAULT_PATH;
    static string path;

这不重要,但与任何例子一样有效。

因此,为了做正确的初始化,我必须做一些研究,并发现这不能在类体中完成,必须在源(Class.cpp)文件中完成。在我的源文件中,我添加了:

const string Class::DEFAULT_PATH = "./";
string Class::path = DEFAULT_PATH;

我发现这是违反直觉的,但试图解决它。然后我想知道:

  • 编译器何时调用此初始化代码?我怎么能假设这个字段什么时候有值?我真的不明白那里发生了什么,我想知道。

  • 对我来说最有趣的是:在包含class.hpp时,我可以在Class.cpp中看到哪些符号?为什么这些声明已经在类体外和另一个文件中?

1 个答案:

答案 0 :(得分:3)

  • 静态成员在主要开始之前初始化,因此它们已在主体中已经初始化。该类的非静态成员在构造函数中初始化。
  • 如果要强制执行初始化顺序(因为一个变量引用另一个变量就是这种情况),您可以使用函数初始化函数C++ static initialization order
  • boost :: call_once(或其等效的c ++ 11)可以帮助你。 http://www.boost.org/doc/libs/1_31_0/libs/thread/doc/once.html
  • 标准告诉你它必须在类定义之外的某个地方进行初始化,所以通常你在cpp文件上进行初始化
  • 完成此操作后,您可以使用 :: static_member
  • 访问变量