devxlogo

Local Static Variables Inside a Member Function

Local Static Variables Inside a Member Function

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 > 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//..};

devx-admin

Share the Post: