C/C++关键字 static

修饰对象

1 修饰变量:

     修饰全局变量:限定全局变量只能在本文件使用,无法在其他文件中使用(当其他文件使用extern关键字时,也不能使用)

     修饰局部变量:由于被static修饰的变量总是存在内存中的静态区,所以即使函数运行结束,该静态变量仍然不会被销毁,下次调用函数的时候,还是可以使用到该静态变量。(即static关键字修饰局部变量时有延长变量生命周期的作用,另外,被static修饰的变量的语句在所有次函数调用的时候只执行一次。)

int fun(int a)
{
    static int b=10;//该定义只在i=0时执行一次
    b+=a;
    return b;
}
int main()
{
    for(int i=0;i<10;i++)
        {
            printf("%d   ",fun(i));
        }
        return 0;
}

2 修饰函数:

  修饰函数时,函数作用域只限定于本文件,其他文件不可使用,可防止不同文件函数重名的问题。

以上为static在C中的作用。

—————————————————————————————————————————————————————

static 在C++类中的作用

1 修饰成员变量

  1)修饰成员变量时,被修饰的成员变量不占用对象的内存空间,在对象生成时该成员无栈帧或堆区空间的开辟,其存在于内存的静态区。

  2)共享性,被static修饰的类成员变量属于该成员所对应的类,而不属于任何一个实例化对象,但可以通过实例化对象去访问该类成员。该变量的生存周期为程序启动至程序结束。(利用此性质可以发散到对一个数不用循环   不用递归改变其值的一些题)

 3)修饰成员方法时:位于类中的非静态成员方法在传参时有一个隐含的this指针传入,this指针指向本对象(这也是不同对象实现同一个类成员方法时,各对象间数据不互相影响的原因),访问该对象的成员变量时,通过this指针访问。  而当使用static修饰成员方法时,该成员方法没有this指针的隐含传入,也就不能通过隐含的this指针访问该对象的非静态成员变量。在static修饰的成员方法中,只能访问到该类的静态成员变量。

static 在C++中的使用:

 1)由于this指针的影响,会导致类成员方法中实际参数与我们想要的参数不一致,使得当其作为某些规定了参数类型的函数时,与要求类型不符合从而出现错误。例如作为线程开辟的回调函数时,我们想要的回调函数是  void *fun(void *arg)  不使用关键字static,其会隐含传入this指针,导致参数列表与规定不符。

 2)当我们想要一个成员变量可以记录所有对象对该变量做出的改变时,我们可以给成员变量加上static关键字。例如 当我们想要用map表记录所有对象产生的某种行为(比如申请了一个结构体 需要存下来给其他函数访问)。就可以将map表变量声明为静态的。

目前只发现这两种常用的用法,欢迎补充。

 

 

 

   

 

猜你喜欢

转载自blog.csdn.net/wm06260514/article/details/86439477