Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


Tip of the Day
Language: C++
Expertise: Beginner
Aug 21, 2000

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
//..
};
DevX Pro
 
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap
Thanks for your registration, follow us on our social networks to keep up-to-date