Статические свойства в C ++ - PullRequest
1 голос
/ 27 августа 2010

С псевдокодом, подобным этому:

class FooBar {
public:
    int property;
    static int m_static;
}

FooBar instance1 = new FooBar();
FooBar instance2 = new FooBar();

Если я установлю свойство instance1, оно, очевидно, не повлияет на второе. Однако, если я вместо этого установлю статическое свойство, изменение должно распространиться на каждый экземпляр класса.

Это также произойдет, если instance1 и 2 находятся в разных потоках?

Ответы [ 3 ]

9 голосов
/ 27 августа 2010

Член static по сути является глобальной переменной, связанной с классом (не экземпляром!).Глобальные переменные не локально для потока, поэтому изменение этой переменной будет отражено во всех потоках.

(Кстати, C ++ 98 не имеет понятия потоков. В C ++ 0x вы можете сделать его локальным для потока (согласно §9.4.2 / 1) с помощью

static thread_local int static_property;

, но это не поддерживается широко .)

2 голосов
/ 27 августа 2010

Да, в программе будет только один экземпляр переменной FooBar::static. Конечно, доступ к одной и той же переменной из потоков по своей природе опасен.

Экземпляры не имеют значения вообще, вы можете получить доступ к (общедоступному) статическому члену также из внешних экземпляров класса.

Примечание: как написано, это не скомпилируется, так как вы не можете использовать «static» в качестве имени переменной, это зарезервированное слово.

0 голосов
/ 27 августа 2010

Существует только одна копия статических переменных класса, и она является общей для всех объектов класса, и доступ к ней должен быть синхронизирован, поскольку она не является поточно-ориентированной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...