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

By submitting your information, you agree that devx.com may send you DevX offers via email, phone and text message, as well as email offers about other products and services that DevX believes may be of interest to you. DevX will process your information in accordance with the Quinstreet Privacy Policy.


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

WEBINAR:

On-Demand

Application Security Testing: An Integral Part of DevOps


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