【问题标题】:When to use static variable C++何时使用静态变量 C++
【发布时间】:2014-09-16 10:54:11
【问题描述】:

我对 static / global / global static / extern 变量的用法有点困惑。

我希望在创建类实例时增加一个计数器变量。

如果有人可以对每种方法的适当用法进行说明,我们将不胜感激。

【问题讨论】:

标签: c++ static global-variables extern


【解决方案1】:

根据 OO 概念,您永远不应该使用全局静态变量。 相反,您可以在您的类中为您的类的实例计数定义一个静态变量。 将其设为私有,以便除了您的构造函数之外没有其他人可以增加计数。 提供一个公共函数来获取计数器。请参见下面的示例:

你的班级.h:

class YourClass {
private:
    static int instanceCount_;
public:
    YourClass() {++YourClass::instanceCount_;}  // constructor
    ~YourClass() {--YourClass::instanceCount_;} // destructor
    static int instanceCount() {return instanceCount_;}
};

你的类.cpp:

int YourClass::instanceCount_ = 0;

就静态/全局/全局静态/外部的概念而言 1.静态: 1a) 全局静态: 如下所示的静态变量形式:

static int numberOfPersons;

这种变量只能在一个文件中看到(不会与其他文件中的其他同名变量发生名称冲突)

1a) 类静态:(在上面的实例计数中已经有一个示例) 一个类可能有静态成员,它们仅对该类可见(仅由 Class::Var 形式访问)(而不是如上所述的“仅文件”)。它不会与其他类中的相同变量名发生名称冲突。每个类只有一个副本(不是每个实例)。

1b) 全局静态和类静态都是全局的。 (因为它们可以被全局访问,无论是否使用类限定符“Class::”。

所以,1a。和 1b。解释静态、全局和全局静态,呃,部分解释,见下文 2.

  1. 另一种形式的全局变量,只是定义一个不带'static'的变量,如下所示:

    int numberOfPersons;

没有'static',这个变量可以被其他文件看到,使用'extern'关键字。并且它将与其他文件中的相同变量发生名称冲突。因此,在全局范围内,您只能在所有源文件中定义一次。

  1. extern:声明一个在其他地方定义的变量/函数。它通常出现在头文件中。如 3. 中所述,您可以在其他文件中定义一些变量,并在使用它的另一个源文件中将此变量声明为 extern,如下所示。 extern int numberOfPersons;

    int addPersonCount() { 人数++; }

希望这会有所帮助。

【讨论】:

  • @RoninHsh,谢谢。 inline 是什么意思?
  • 不要忘记复制构造函数和移动构造函数。也许在这里不相关,但使用原子可能更好地保证线程安全。
  • 但是 C++ 不是 OO 语言;它是多范式的。因此,这个答案不仅非常不完整,而且可以说完全没有抓住问题的重点。
  • 对不起,忘了提析构函数,以减少计数。
  • 已更新。头文件中定义的任何内容都已内联。因此inline 是多余的,并被删除。 inline 表示优化它,就好像它是在函数调用者的上下文中编写的,而不是真正调用它。 (inline 到它被调用的地方)。
猜你喜欢
  • 2013-04-01
  • 2020-03-31
  • 1970-01-01
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多