static variable inside member function of base class

12,065

Solution 1

Static variables declared in member functions will keep their value between function calls. There will be only one copy over all instances, and all accesses to indicator from different instances will affect the same indicator. This means indicator will only be initialized once.

See here for more info: Static variables in member functions

Also this code does not toggle indicator, it always sets it to true if it's false (which I'm sure is the behaviour you want).

if(!indicator)
     {
        ...
        indicator=true;
      }

Solution 2

This is precisely the behavior of static variables declared inside function blocks. It has been like that since the introduction of the feature in the C programming language.

The static declaration can also be applied to internal variables. Internal static variables are local to a particular function just as automatic variables are, but unlike automatics, they remain in existence rather than coming and going each time the function is activated. (K&R, page 61).

The static initializer is executed before the first invocation of the containing function. Being static, the variable retains its last state across the invocations.

Share:
12,065
user1612986
Author by

user1612986

Updated on June 11, 2022

Comments

  • user1612986
    user1612986 about 2 years

    i have the following:

       class base
       {
          public
           void f();
           ...
       }
        void base::f()
        {
            static bool indicator=false;
             .....
             if(!indicator)
             {
                ...
                indicator=true;
              }
         }
        class D:public base
        {      
           ...
         }
    

    in my main() i have:

          main()
          {
              // first instance of D
              base *d1 = new D();
              d1->f();
               ....
               // 2nd instance of D
              base *d2 = new D();
              d2->f();
           }
    

    i find that the first time i instantiate D and call d1->f() the static variable is set to false. but the 2nd time i call d2->f() the code does not even hit the line "static bool indicator=false;" and it is kept at true (from the first pass of d1-f()) This is exactly the behavior i want but i do not understand why this is happening. can someone please explain what is happening. thanks in advance

    • Lou
      Lou over 11 years
      By design, the initializer is run only once for static variables within a function. If you didn't want that behavior, then you would just declare the variable as non-static. The point is to maintain the value through multiple calls of the function.
  • johnbakers
    johnbakers over 8 years
    According to stackoverflow.com/a/35251486/3758484, this answer is incorrect as it is with regards to the C language, and this is a C++ question.
  • Sergey Kalinichenko
    Sergey Kalinichenko over 8 years
    @johnbakers You are correct, compile-time constant requirement has been lifted for C++. Thanks!
  • 463035818_is_not_a_number
    463035818_is_not_a_number about 6 years
    not your fault, but the title of the question you link is a bit confusing, because "class methods" can be understood as refering to static methods.
  • Felix Glas
    Felix Glas about 6 years
    @user463035818 Yes, agreed. The correct C++ term would be "member functions". I've updated the title in the referenced question.