2010-09-23 5 views
4

Я хочу знать, есть ли у меня статическая переменная в функции члена класса, если эта переменная будет иметь экземпляр только для этого класса или для каждого объекта этого класса. Вот пример того, что я хочу сделать.Является ли локальная статическая переменная для каждого экземпляра или для каждого класса?

class CTest 
{ 
public: 
    testFunc(); 

}; 

CTest::testFunc() 
{ 
    static list<string> listStatic; 
} 

Является ли listStatic для каждого экземпляра или класса?

+2

Очевидная заметка: статическая переменная предназначена для всех целей и целей, глобальная переменная со всеми бедами, которые она несет, среди которых: нет возможного повторного входа (тестирование сложнее), обязательства сериализации доступа в многопоточном коде (узкое место производительности), ... По возможности старайтесь не использовать глобальные переменные (и, следовательно, синглтоны). –

ответ

9

В этой функции CTest::testFunc() - каждая инволюция этой функции-члена будет использовать ту же переменную.

+2

Это верно также и для статических переменных в функциях, объявленных вне класса (свободные постоянные функции). Также верно, что в классе есть только один экземпляр переменной, но только потому, что функция принадлежит классу. Переменная инициализируется только один раз, когда функция сначала вызывается, что позволяет контролировать зависимости инициализации. – gregg

2

Является «для каждого класса», поскольку он является статическим для фактического метода, и существует только одно место, где этот метод есть, т. Е. В классе.

5

Что-то, чтобы получить ваш ум кипения:

template <typename T> 
struct Question 
{ 
    int& GetCounter() { static int M; return M; } 
}; 

И в этом случае, сколько счетчики?
.
.
.
.
Ответ: так много различных T, для которых Question конкретизируется с, то есть template не сам класс, но Question<int> класс, отличный от Question<double>, поэтому каждый из них имеет другой счетчик.

В основном, как было сказано, локальный статический элемент является правильным для функции/метода. Существует один метод, и два разных метода будут иметь два разных локальных статических (если они вообще есть).

struct Other 
{ 
    int& Foo() { static int M; return M; } 
    int& Bar() { static int M; return M; } 
}; 

Здесь есть 2 счетчика (всего): один Other::Foo()::M и другой Other::Bar()::M (имена только для удобства).

Тот факт, что существует класс аксессуар:

namespace Wazza 
{ 
    int& Foo() { static int M; return M; } 
    int& Bar() { static int M; return M; } 
} 

Два других счетчиков: Wazza::Foo()::M и Wazza::Bar()::M.

Смежные вопросы