Browse DevX
Sign up for e-mail newsletters from DevX

Tip of the Day
Language: C++
Expertise: Beginner
Sep 10, 1998



Building the Right Environment to Support AI, Machine Learning and Deep Learning

Be Cautious with Local Static Variables in a Member Function

The object model of C++ ensures that each object instance gets its own copy of data members (except for static ones). On the other hand, all instances of a base class, as well as instances of classes derived from it, share a single copy of the member functions of the base class. Therefore, declaring a local static variable (not to be confused with static class members) in a member function can cause surprises like this:
class Base {
	public: int countCalls() { static int cnt = 0; return ++cnt; } };
class Derived1 : public Base { /*..*/};
class Derived2 : public Base { /*..*/};
Derived1 d1;
int d1Calls = d1.countCalls(); //d1Calls = 1
Derived2 d2;
int d2Calls = d2.countCalls(); //d2Calls = 2 and not 1 
The above example may be used to measure load balancing by counting the total number of invocations of the countCalls member function, regardless of the actual object from which it was called. However, obviously that programmer's intention was to count the number of invocations through Derived2 class exclusively. In order to achieve that, a static class member would be preferable:
class Base {
	private: static int i; //static class member rather than a local static variable
	public: virtual int countCalls() {  return ++i; } };
class Derived1 : public Base {
private: static int i; //hides Base::i
	public: int countCalls() {  return ++i; } //overrides Base:: countCalls()  };
class Derived2 : public Base {
private: static int i; //hides Base::i and distinct from Derived1::i
	public: virtual int countCalls() {  return ++i; } };
Derived1 d1; Derived2 d2;
int d1Calls = d1.countCalls(); //d1Calls = 1
int d2Calls = d2.countCalls(); //d2Calls also = 1 
Danny Kalev
Comment and Contribute






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



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