何时使用静态变量C++

7
我有点困惑于静态变量 / 全局变量 / 全局静态变量 / 外部变量的使用。
我想让一个计数器变量在创建任何类实例时都增加。
如果有人能发表关于每个变量的适当用法的澄清,将不胜感激。

前两段似乎没有关联?你只需要在你的类中使用一个static计数器变量,在你的构造函数中递增它,在你的析构函数中递减它。 - Paul R
@PaulR,为什么不用全局变量? - yael aviv
重复的问题。https://dev59.com/VWUp5IYBdhLWcg3wf3us和https://dev59.com/Wmkv5IYBdhLWcg3wsCxO。 - Sam Varshavchik
一个静态类变量有点像全局变量,因为它只有一个实例,并且与程序的生命周期相同。 - Paul R
@PaulR,哈哈!这就是让我感到困惑的东西... - yael aviv
1个回答

5
根据OO概念,你绝对不应该使用全局静态变量。相反,你可以在你的中定义一个静态变量来计算你的的实例数量。将其设为private,这样除了你的构造函数以外,没有任何人能够增加计数器。提供一个public函数来获取计数器。请参考下面的示例:

yourclass.h:

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

yourclass.cpp:

int YourClass::instanceCount_ = 0;

关于 static / global / global static / extern 的概念:
  1. static:

1a) 全局静态变量: 创建一个静态变量如下:static int numberOfPersons;

这种类型的变量只能在当前文件中被访问到(不会与其他文件中同名变量发生命名冲突)。

1b) 类静态变量:(实例计数器中已经有了相应的示例) 一个类可以拥有静态成员,这些成员只能被该类访问(只能使用Class::VarName语法来访问),而不是像上面所说的‘只在当前文件中’。它不会与其他类中同名变量发生命名冲突,每一个类只有一个该变量的副本(而不是每个实例都有一份)。

1c) 全局静态变量类静态变量都是全局的(因为它们可以通过类限定符Class::或者不带限定符的方式进行全局访问)。

因此,1a、1b和1c部分解释了staticglobalglobal static的概念。

  1. 另一种全局变量定义方式,即不带有static
    语法:int numberOfPersons;

没有static,这个变量可以被其他文件看到,使用extern关键字。如果在其他文件中有相同名字的变量,那么它们会发生命名冲突。因此,在所有源文件中,您只能定义一个全局变量一次

  1. extern: 声明一个别处已定义的变量/函数。通常在头文件中使用。我们可以在另一个使用这个变量的源文件中将这个变量声明为extern,如下所示:
extern int numberOfPersons;

    int addPersonCount()
    {
         numberOfPersons++;
    }

希望这可以帮助到您。

@RoninHsh,谢谢你。inline是什么意思? - yael aviv
1
不要忘记复制构造函数和移动构造函数。也许在这里不相关,但使用原子可能更好地保证线程安全。 - Niall
1
但是C++并不是一种面向对象的语言,它是多范式的。因此,这个答案不仅非常不完整,而且可能完全错过了问题的重点。 - Lightness Races in Orbit
抱歉,忘记提到析构函数来减少计数。 - Robin Hsu
更新。头文件中定义的任何内容已经是内联的。因此,“inline”是多余的,应该被删除。“inline”意味着将其优化为调用函数的上下文中编写的代码,而不是真正地调用它。(将“inline”放到调用它的位置)。 - Robin Hsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接