C++ Tutorial/Language Basics/static

Материал из C\C++ эксперт
Перейти к: навигация, поиск

A static local variable causes the compiler to create permanent storage for it in much the same way that it does for a global variable.

#include <stdio.h>    
#include <conio.h>   
     
int count(int i);   
     
int main(void)   
{   
  do {   
    count(0);   
  } while(!kbhit());   
  printf("count called %d times", count(1));   
  return 0;   
}   
     
int count(int i)   
{   
  static int c=0;   
     
  if(i) return c;   
  else c++;   
  return 0;   
}

Initialize static member field outside the class declaration

#include <iostream>
using std::cout;
using std::endl;
class Box {
  public:
    Box() {
      cout << "Default constructor called" << endl;
      ++objectCount;
      length = width = height = 1.0;
    }
    Box(double lvalue, double wvalue, double hvalue) :
                              length(lvalue), width(wvalue), height(hvalue) {
      cout << "Box constructor called" << endl;
      ++objectCount;
    }
    double volume() const {
      return length * width * height;
    }

    int getObjectCount() const {return objectCount;}
  private:
    static int objectCount;
    double length;
    double width;
    double height;
};
int Box::objectCount = 0;
int main() {
  cout << endl;
  Box firstBox(17.0, 11.0, 5.0);
  cout << "Object count is " << firstBox.getObjectCount() << endl;
  Box boxes[5];
  cout << "Object count is " << firstBox.getObjectCount() << endl;
  cout << "Volume of first box = "
       << firstBox.volume()
       << endl;
  const int count = sizeof boxes/sizeof boxes[0];
  cout <<"The boxes array has " << count << " elements."
       << endl;
  cout <<"Each element occupies " << sizeof boxes[0] << " bytes."
       << endl;
  for(int i = 0 ; i < count ; i++)
    cout << "Volume of boxes[" << i << "] = "
         << boxes[i].volume()
         << endl;
  return 0;
}
Box constructor called
Object count is 1
Default constructor called
Default constructor called
Default constructor called
Default constructor called
Default constructor called
Object count is 6
Volume of first box = 935
The boxes array has 5 elements.
Each element occupies 24 bytes.
Volume of boxes[0] = 1
Volume of boxes[1] = 1
Volume of boxes[2] = 1
Volume of boxes[3] = 1
Volume of boxes[4] = 1

Use static variable to compute a running average of numbers entered by the user

#include <iostream> 
using namespace std; 
 
int f(int i); 
 
int main() 
{ 
  int num; 
 
  do { 
    cout << "Enter numbers (-1 to quit): "; 
    cin >> num; 
    if(num != -1) 
      cout << "average is: " << f(num) << "\n"; 
    
  } while(num > -1); 
 
  return 0; 
} 
 
int f(int i) 
{ 
  static int sum = 0, count = 0; 
 
  sum = sum + i; 
 
  count++; 
 
  return sum / count; 
}
Enter numbers (-1 to quit): 1
average is: 1
Enter numbers (-1 to quit): 2
average is: 1
Enter numbers (-1 to quit): 3
average is: 2
Enter numbers (-1 to quit): 2
average is: 2
Enter numbers (-1 to quit): 1
average is: 1
Enter numbers (-1 to quit): 2
average is: 1
Enter numbers (-1 to quit): 3
average is: 2
Enter numbers (-1 to quit): -1

Using a static long variable

#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
long next();
int main() {
  for(int i = 0 ; i < 30 ; i++) {
    cout << std::setw(12) << next ();
  }
  cout << endl;
  return 0;
}
long next () {
  static long last = 0;
  last = last + 1;   
  return last;
}
1           2           3           4           5           6
   7           8           9          10          11          12          13
      14          15          16          17          18          19          20
          21          22          23          24          25          26
  27          28          29          30