Static Member Functions

Static member functions are considered to have class scope. In contrast to nonstatic member functions, these functions have no implicit this argument; therefore, they can use only static data members, enumerators, or nested types directly. Static member functions can be accessed without using an object of the corresponding class type. Consider this example:

class WindowManager
{
public:
    static int  CountOf();              // Return count of open windows.
           void Minimize();             // Minimize current window.
           WindowManager SideEffects(); // Function with side effects.
    ...
private:
    static int wmWindowCount;
};
int WindowManager::wmWindowCount = 0;

...

// Minimize (show iconic) all windows
for( int i = 0; i < WindowManager::CountOf(); ++i )
    rgwmWin[i].Minimize();

In the preceding code, the class WindowManager contains the static member function CountOf. This function returns the number of windows open but is not necessarily associated with a given object of type WindowManager. This concept is demonstrated in the loop where the CountOf function is used in the controlling expression; because CountOf is a static member function, it can be called without reference to an object.

Static member functions have external linkage. These functions do not have this pointers. As a result, the following restrictions apply to such functions:

  • They cannot access nonstatic class member data using the member-selection operators (. or –>).
  • They cannot be declared as virtual.
  • They cannot have the same name as a nonstatic function that has the same argument types.

Note   The left side of a member-selection operator (. or –>) that selects a static member function is not evaluated. This can be important if the function is used for its side effects. For example, the expression SideEffects().CountOf() does not call the function SideEffects.