c与c++的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!

4 time called!

静态全局变量

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

静态函数

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

面向对象

静态数据成员

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

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

静态函数成员

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

#include <cstdlib>
#include <iostream>

using namespace std;

class testStatic{
      private:
              static int a;//不允许在内部初始化不是const类型的static变量 
              static const int aconst=10;
              int b;
              public:
                     testStatic(){}
                     testStatic(int btemp){
                         b=btemp;
                     }
                     static int geta(){
                         ++a;
                         return a;
                     }
      };
int testStatic::a=100;//类中静态成员初始化的形式,主函数调用之前完成初始化,程序结束释放 


int main(int argc, char *argv[]) {    

    testStatic test1;
    cout<<testStatic::geta()<<endl;
    cout<<test1.geta()<<endl;
    
	system("PAUSE");
	return EXIT_SUCCESS;
}

static存储

 函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉, static被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间

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

你可能感兴趣的:(C++,c,static)