C/C++的static

http://my.oschina.net/hnuweiwei/blog/284467

static关键字详解:

面向过程

静态局部变量

函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)

在函数体内,一个被声明为静态的变量在这一函数被调用过程中维持其值不变(该变量存放在静态变量区)
    
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
void counter()
{
    static int count = 0;
    ++count;
    cout<<count<<" time called!"<<endl;
}
 
int main(int argc, char *argv[]) {
 
    counter();
    counter();
    counter();
    counter();
     
    system("PAUSE");
    return EXIT_SUCCESS;
}

output:

1 time called!

2 time called!   //因为值没有变化,所以下次计数会按照上次的运行结果的值

3 time called!  //如果不加static,每次调用,都是重新赋值为0,所以加了static,变量存储在静态区

4 time called!

静态全局变量

在模块内,在函数体外,一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问,它是一个本地的全局变量

静态函数

在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用,这个函数被限制在声明它的模块的本地范围内使用

面向对象

静态数据成员

中的static成员变量意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见

初始化静态数据成员必须初始化,并且只能在类外初始化;由于静态数据成员不属于某一个对象,因此不能通过构造函数的方式初始化静态数据成员

静态函数成员

在类中的static成员函数属于整个类所拥有,这个函数不接收this指针非静态成员函数可以任意地访问静态成员函数和静态数据成员静态成员函数不能访问非静态成员函数和非静态数据成员

 1 #include <iostream>
 2 using namespace std;
 3 class teststatic {
 4 private:
 5     static int a;            //静态数据成员
 6     static const int aconst = 10;
 7     int b;
 8 public:
 9     teststatic() {}
10     teststatic(int btemp) {
11         b = btemp;
12     }
13     static int geta() {                        //静态函数成员
14         ++a;
15         return a;
16     }
17 
18 }; 
19 int teststatic::a = 100;            //静态数据成员必须初始化,并且只能在类外初始化
20 int main(int argc, char * argv[]) {
21     teststatic test1;
22     cout << teststatic::geta() << endl;
23     cout << test1.geta() << endl;
24     system("pause");
25     return EXIT_SUCCESS;
26 }

static存储

static优势:可以节省内存,因为它是所有对象所公有的,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。

Coding
原文地址:https://www.cnblogs.com/ccie-leon-43093/p/5452001.html