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

See also  Why ChatGPT Is So Important Today
devxblackblue

About Our Editorial Process

At DevX, we’re dedicated to tech entrepreneurship. Our team closely follows industry shifts, new products, AI breakthroughs, technology trends, and funding announcements. Articles undergo thorough editing to ensure accuracy and clarity, reflecting DevX’s style and supporting entrepreneurs in the tech sphere.

See our full editorial policy.

About Our Journalist