Question:
I have come across the following situation: if any method of a class has a static variable (not a static class member!), it seems to be shared by all instances of that class, e.g., the following program:
class A{public:typedef enum { ac_save, ac_show } eAction;A() { f(ac_save);}~A(void) { f(ac_show);}private:void f(eAction act) { static int n = 0; // This is the point! switch (act) { case ac_save: cout << "Class A(" << (void*) this << "): "; cin >> n; break;//... } }};int main(void){ A a, b; return 0;}
This prints two identical numbers (needless to say, I entered different ones).Hence the question: what does the C++ standard say about that?
Answer:
As you already discovered, a local static variable defined in a member function is shared by all instances of that member function (including derived classes) and this behavior is fully standard-conforming. Sharing a local static varible can sometime be useful, for instance, when you want to measure how many times a certain member function gets called during the lifetime of a program, regardless of the object that invokes it. However, if you want a private copy for every object that calls the same member function, use a nonstatic local variable instead:
class A{public: void f() { int n; // not shared }};A a, b;a.f(); // has a private local n b.f(); // ditto
Finally, if you need a non-shared variable that retains its value from a previous invocation of a member function, use a data member instead of declaring a local variable inside the function body:
class A{public: enum eAction {ac_save, ac_show};private: eAction action ; // ordinary data member, not shared//..};