Статические переменные в методах экземпляра - PullRequest
11 голосов
/ 29 января 2010

Допустим, у меня есть эта программа:

class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;
}

(Конечно, этот пример не имеет смысла, так как я бы явно объявил "counter" как частный атрибут, но это просто для иллюстрации проблемы).

Я хотел бы знать, как C ++ ведет себя в такой ситуации: будет ли переменная "counter" в методе bar () одинаковой для каждого экземпляра?

Ответы [ 5 ]

10 голосов
/ 29 января 2010

Да, counter будет использоваться всеми экземплярами объектов типа Foo в вашем исполняемом файле. Пока вы находитесь в однопоточной среде, он будет работать как и ожидалось, как общий счетчик.

В многопоточной среде вы будете иметь интересные условия гонки для отладки:).

2 голосов
/ 29 января 2010

Под словом «быть одинаковым для каждого экземпляра» вы подразумеваете, что будет один экземпляр этой переменной, общий для каждого экземпляра класса, тогда да, это правильно. Все экземпляры класса будут использовать один и тот же экземпляр переменной.

Но имейте в виду, что с переменными класса во многих случаях приходится принимать во внимание такие вещи, как многопоточность, а это совершенно другая тема.

1 голос
/ 29 января 2010

Ваш пример был на расстоянии нескольких строк от того, что вы могли бы скомпилировать и протестировать:

#include <iostream>
using namespace std;
class Foo {
 public:
    unsigned int bar () {
        static unsigned int counter = 0;
        return counter++;
    }
};

int main ()
{
    Foo a;
    Foo b;

    for (int i=0; i < 10; i++)
      cout<<i<<". "<<a.bar()<<" / "<<b.bar()<<endl;
}

Вывод выглядит так:

0. 1 / 0
1. 3 / 2
2. 5 / 4
3. 7 / 6
4. 9 / 8
5. 11 / 10
6. 13 / 12
7. 15 / 14
8. 17 / 16
9. 19 / 18

Так что да, счетчик используется всеми экземплярами.

1 голос
/ 29 января 2010

С Язык программирования C ++ (2-е издание) , стр. 200, Бьярн Страуструп:

Не используйте static , кроме как внутри [plain] функций (§7.1.2) и классов (§10.2.4).

0 голосов
/ 29 января 2010

Вам просто нужно понять две вещи:

  1. Статические переменные хранятся в статической области исполняемой программы (которая совпадает с глобальной переменной).
  2. Область действия ограничена общими правилами скобок. Кроме того, статические переменные имеют внутреннюю связь.
...