=====static===== The static keyword can be used in four different ways: - to create permanent storage for local variables in a function, - to create a single copy of class data, - to declare member functions that act like a non-member functions, and - to specify internal linkage. ====Permanent storage==== Static local variables keep their value between function calls. For example, in the following code, a static variable inside a function is used to keep track of how many times that function has been called: void foo() { static int counter = 0; cout << "foo has been called " << ++counter << " times\n"; } int main() { for( int i = 0; i < 10; ++i ) foo(); } ====Single copy of class data==== When used in a class data member, all instantiations of that class share one copy of the variable. class Foo { public: Foo() { ++numFoos; cout << "We have now created " << numFoos << " instances of the Foo class\n"; } private: static int numFoos; }; int Foo::numFoos = 0; // allocate memory for numFoos, and initialize it int main() { Foo f1; Foo f2; Foo f3; } In the example above, the static class variable numFoos is shared between all three instances of the Foo class (f1, f2 and f3) and keeps a count of the number of times that the Foo class has been instantiated. ====Class functions callable without an object==== When used in a class function member, the function does not take an instantiation as an implicit [[this]] parameter, instead behaving like a free function. This means that static class functions can be called without creating instances of the class: class Foo { public: Foo() { ++numFoos; cout << "We have now created " << numFoos << " instances of the Foo class\n"; } static int getNumFoos() { return numFoos; } private: static int numFoos; }; int Foo::numFoos = 0; // allocate memory for numFoos, and initialize it int main() { Foo f1; Foo f2; Foo f3; cout << "So far, we've made " << Foo::getNumFoos() << " instances of the Foo class\n"; } ====Internal linkage==== When used on a free function, a global variable, or a global constant, it specifies internal linkage (as opposed to [[extern]], which specifies external linkage). Internal linkage limits access to the data or function to the current file. Related: [[extern]]