C/C++ static

2019-09-01 0 条评论 54 次阅读 0 人点赞

C语言中的static

在C中我们知道,static作为一个关键字,既能修饰变量,也能修饰函数

1. 修饰变量

  • 若修饰局部变量,则会改变他的生命周期,变量出了它现在所处的作用域,也不会被销毁。因为此时它已经不是存储在上,而是存在数据段上,数据段上的内容只有进程结束才会被销毁,但它的作用域不会被改变,还是处于当前作用域,该作用域之外不可见。

    注意:由于static局部变量的特性,使得含有静态局部变量的函数变得不可重入,每次调用会产生不同的结果,在多线程编程中是一种隐患,使用的话多加小心。

  • 若修饰全局变量,它也是存储在数据段上,生命周期和作用域未改变,有所改变的是其链接属性,全局变量原本是有默认的外部链接属性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过extern 全局变量名的声明,就可以使用全局变量。加上static关键字后,只在定义它的源文件有效,在其他文件无法访问。

    static int g_a = 0;//被初始化的静态全局变量系统会为其分配真正的空间
    static int g_b;//未被初始化的静态全局变量系统不会为其分配真正的空间

2. 修饰函数

和修饰全局变量类似,只改变其链接属性。因此在不同的源文件我们可以使用同名的函数。

C++中的static

  • 类外的static成员

    1. 作用

    • 局部变量被申明为static,表示这个函数结束的时候这个的值不变。

    • 外部变量被申明为static表明它是一个本地全局变量。该变量只能在该文件内被访问,不能被其它文件访问。

    2. static与非static的区别

    • static全局变量:static全局变量只初使化一次,防止在其他文件单元中被引用
    • static局部变量:static局部变量只被初始化一次,下一次依据上一次调用结果值
    • static函数:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
  • 类中的static成员

    1.static成员函数

    • 关键字static只在类的定义体内部出现(与const不同,与friend相同)

    • 没有this指针

    • 不能被声明为const或virtual

    2. static成员变量

    • 静态数据成员相关的操作有三个分别是声明、定义、初始化

    声明:说明这个类中有这样一个成员,但是不分配空间(1)

    定义:分成员开辟内存空间,静态成员的空间在静态成员区,和类的其它成员不在一起(2)

    初始化:为它定义一个初值(4)

    • 对于static数据成员:
      声明在函数体内,定义和初始化要在函数体外,定义和初始化常常放在一句话里(3)
      (2)和(3)不能同时出现
    class A{
    public:
    static int x; //(1)
    };
    
    int A::x; //(2)
    int A::x = 2; //(3)
    
    int main(){
    A::x = 2; //(4)
    return 0;
    }

    3. static成员常量

    对于const static数据成员,声明在函数体内,定义在函数体外,但是初始化可以在函数体内或外都可以

    注意:

    • const在声明和定义时都要出现,而static只在声明的时候出现
      如果在函数体外初始化,和前一个例子相同,下面程序是在函数体内定义的情况
    • 不要把定义少了
    
    class A{
    public:
    const static int x = 2;//声明和初始化在一起
    };
    
    const int A::x;//定义
    
    int main(){
    //    A::x = 2;//(4)
    return 0;
    }

    注意:

    1.声明和定义必不可少

    • 少了声明,会出现链接错误

    • 少了定义,会没有分配空间

    • 少了初始化,默认初始化为0

    2.非static数据成员不能用作默认实参

    class A{
    public:
    static int x;
    int y;
    void Test1(int para = x){}//正确
    void Test2(int para = y){}//错误
    };
    int A::x = 2;//定义

    3.静态数据成员在没有对象之前就存在

    4.静态成员函数不能被说明为虚函数

L_KingMing

这个人太懒什么东西都没留下

文章评论(0)