由浅入深-static-变量存储

来源:互联网 发布:elk nginx日志分析 编辑:程序博客网 时间:2024/05/29 01:55
 

由浅入深-static-变量存储先说说static成员函数,c++primer和网上相关资料描述的并不多;没感受到实际的好处,待了解由浅入深-static-变量存储

主要集中表明三点:

1 static是类的而不是任何对象的组成部分,所有没有this指针

2 不能被声明为const,const表示不会修改函数所属的对象,因为不是对象的组成部分,so..you know

3 不能被声明为虚函数

4 static成员函数只能使用static成员变量

 

由浅入深-static-变量存储static成员

--说明:c++类static成员和c中的static成员类似,无非是只分配一次内存,供所有对象使用,存储在全局区域;

  简单说,就是多次调用,值会保留,直到程序结束后才撤销

--相对与全局变量好处:仍然属于类,保证类的封装完整性;

--和一般成员区别:

  1) 属于类不属于任何对象的组成部分

  2) 不能通过构造函数初始化,在类体内定义,如static int i;类体外初始化,且不用static关键字

  3) 特殊类型 static const i=10;需要在类体内部初始化;

--举例

class Class_static{

    static const int iConstGlobal=5;    //static const 类体初始化
    static  int iGlobal;                //类体未初始化
    int iPrivate;

 

    public:
    static int pGlobal() {
        cout<<"hello pGlobal"<<endl;
        cout<<"iConstGlobal="<<iConstGlobal<<endl;
        iGlobal++;
        return iGlobal;
        //static成员函数只能使用static成员

    int pPrivate() {
        cout<<"hello pPrivate"<<endl;
        return iPrivate;}

    Class_static(){
        iPrivate=100;
    }
};
int Class_static::iGlobal=10;

 

void main()

{

    Class_static c1;
    cout<<c1.pPrivate()<<endl;  //100

    cout<<c1.pPrivate()<<endl;  //100

    cout<<c1.pGlobal()<<endl;   //11
    cout<<c1.pGlobal()<<endl;   //12

    Class_static c2;
    cout<<c2.pGlobal()<<endl;   //13

}

 

由浅入深-static-变量存储static其他用处: 静态局部变量 - 静态全局变量 - 静态函数

--1) static 和 非static : 声明周期不同

--2) 全局和局部:存储区域不同

--3) static函数只能文件内部使用,可防止与文件外部函数重名造成的错误

 

由浅入深-static-变量存储扩充 变量的存储

 

 --1 作用域和生存周期


 1)extern--函数外部定义变量的缺省存储方式;
  作用域:整个程序;
  生存周期:从main()函数开始被调用到程序退出;
 2)static
  作用域:从定义点到该文件结尾
  生存周期:同extern
 3)auto
  作用域:从定义到局部程序块尾部,生存周期
  从函数调用到函数返回;--函数内部缺省存储方式;
 4)动态分配方式,从调用malloc等开始,到free结束;
 
 --2 存储内存区域--依赖于生存周期
 1)函数外定义的全局变量,staic变量和函数内定义的static变量,存储在数据段(全局区域)中,分两部分,定义和未定义的;
 2)auto或者没有auto的一般变量,存储在栈(stack)
 3)自动分配的存在在堆中(heap),如malloc,new等
 
 --3 使用总结:
 1)extern 必须被定义在函数外;extern int e=10; 或者 int e=10;
 2)static 可以在函数内/外定义;只能在本文件内部使用,可供本文件内部所有函数使用;s,和函数声明,要在使用位置前;

--补充:程序的内存分配

 1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

 2、堆区(heap)— 由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表

 3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。

 4、文字常量区 — 常量字符串就是放在这里的,程序结束后由系统释放 。

 5、程序代码区— 存放函数体的二进制代码。