【问题标题】:Static member variables [duplicate]静态成员变量 [重复]
【发布时间】:2014-06-06 20:55:30
【问题描述】:

我开始使用 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 中看到哪些符号?为什么这些声明在类主体之外和另一个文件中?

【问题讨论】:

  • main之前初始化。在此之前不要指望任何订单。并且 定义 必须放在 .cpp 中,这样您就不会违反单一定义规则。
  • 编译器看到.cpp文件,include被预处理器在.cpp文件中替换为.h文件内容。
  • @KerrekSB 好吧,我今天的目标是学习使用类并在 C++ 中进行 OO 编程,尽管看起来很奇怪。我可以说只是出于学习目的。

标签: c++


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多