static
Members Can Be Used in Ways Ordinary Members Can’tAs we’ve seen, static
members exist independently of any other object. As a result, they can be used in ways that would be illegal for nonstatic
data members. As one example, a static
data member can have incomplete type (§ 7.3.3, p. 278). In particular, a static
data member can have the same type as the class type of which it is a member. A nonstatic
data member is restricted to being declared as a pointer or a reference to an object of its class:
class Bar {
public:
// ...
private:
static Bar mem1; // ok: static member can have incomplete type
Bar *mem2; // ok: pointer member can have incomplete type
Bar mem3; // error: data members must have complete type
};
Another difference between static
and ordinary members is that we can use a static
member as a default argument (§ 6.5.1, p. 236):
class Screen {
public:
// bkground refers to the static member
// declared later in the class definition
Screen& clear(char = bkground);
private:
static const char bkground;
};
A nonstatic
data member may not be used as a default argument because its value is part of the object of which it is a member. Using a nonstatic
data member as a default argument provides no object from which to obtain the member’s value and so is an error.
Exercise 7.56: What is a static
class member? What are the advantages of static
members? How do they differ from ordinary members?
Exercise 7.57: Write your own version of the Account
class.
Exercise 7.58: Which, if any, of the following static
data member declarations and definitions are errors? Explain why.
// example.h
class Example {
public:
static double rate = 6.5;
static const int vecSize = 20;
static vector<double> vec(vecSize);
};
// example.C
#include "example.h"
double Example::rate;
vector<double> Example::vec;