Static member: the member with the Static keyword added before the definition. As follows:
classcrectangle{ Public: Crectangle (); ~Crectangle (); Static voidprinttotal ();Private: intW, H; Static intNtotalarea; Static intNtotalnumber;}; Crectangle::crectangle (intW_intH_) {W=W_; H=H_; Ntotalnumber++; Ntotalarea+ = w*h;} Crectangle::~Crectangle () {Ntotalnumber--; Ntotalarea-= w*h;}voidcrectangle::P rinttotal () {cout<< Ntotalnumber <<", "<< Ntotalarea <<Endl;}
int crectangle::ntotalnumber = 0;
int crectangle::ntotalarea = 0;
Static member variables must be described once in the file that defines the class
or initialize, otherwise the compilation can pass, the link cannot pass.
int main ()
{
Crectangle R1 (3, 3), R2 (2, 2);
cout << Crectangle::ntotalnumber; Wrong, private
Crectangle::P rinttotal ();
R1. Printtotal ();
return 0;
}
Difference:
1) Normal member variables each object has its own copy, while the static member variable is shared for all objects.
The sizeof operator does not evaluate static member variables.
class CMyClass { int n; Static int s;};
The sizeof (CMyClass) result is 4
2) A normal member function must be specific to an object, and a static member function does not specifically act on an object.
Therefore, static members do not need to be accessible through objects.
How to access static members
1) class Name:: member name
Crectangle::P rinttotal ();
2) object name. Member Name
Crectangle R; R.printtotal ();
3) member name with pointer
Crectangle *p = &r; P->printtotal ();
4) reference. Member name
Crectangle & ref = R; int n = ref.ntotalnumber;
Static member variables are essentially global variables, and even if an object does not exist, the static member variable for the class exists.
A static member function is essentially a global function.
Setting a static member The purpose of this mechanism is to write global variables and functions that are closely related to certain classes into the class, which looks like
A whole, easy to maintain and understand.
Static member Example
Consider a graphics handler that needs to know the total number of rectangles and the total area at any time
You can use global variables to record total and total area
Using static members to encapsulate these two variables into a class is easy to understand and maintain. (e.g. code at the beginning of the article)
Precautions
1) in a static member function, you cannot access a non-static member variable or call a non-static member function.
Defects in this Crectangle class
When using the Crectangle class, the copy constructor is sometimes called to generate a temporary hidden Crectangle object
1) When invoking a function that takes the Crectangle class object as a parameter
2) when calling a function that takes the Crectangle class object as the return value
Temporary objects call Destructors when they die, reducing the values of ntotalnumber and Ntotalarea, but these temporary
Objects are generated without increasing the values of Ntotalnumber and Ntotalarea.
Workaround: Write a copy constructor for the Crectangle class. As follows
Crectangle::crectangle (Crectangle & R) { = R.W; = R.h; Ntotalnumber++ ; + = w*h;}
C + + static member variables and static member functions