static关键字分别在C和C++中的作用

Posted 狱典司

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了static关键字分别在C和C++中的作用相关的知识,希望对你有一定的参考价值。

  • static用于实现多个对象之间的数据共享 + 隐藏
  • 使用静态成员不会破坏隐藏规则
  • 默认初始化为0
1. C语言中static的特性(面向过程设计中)
  1. 局部变量:在任意一个函数内部定义的变量(不加static),初始值不确定,出函数自动销毁,存放于栈区。 使用static修饰这个变量时,编译器会把她初始化为零,存储于静态区,函数返回时值保持不变,出函数不销毁,下一次进入函数依然存在。根本原因 —— static修饰的局部变量存储在静态区。

静态局部变量的特点:

  1. 在全局数据区分配;
  2. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);
  3. 作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部静态变量离开作用域后,并没有销毁,而是仍然驻留在内存当中,只不过我们不能再对它进行访问,直到该函数再次被调用,并且值不变
  1. 全局变量普通全局变量定义在函数体外部,在静态区分配存储空间,编译器自动对其初始化。普通全局变量对整个工程可见,其他文件使用关键字extern外部声明后可以直接使用。 静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。 在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。

  2. 函数:在函数的返回类型前加上static,就是静态函数。例如:static int main() 静态函数只能在声明它的文件可见,其他文件不能引用该函数。不同文件可以使用相同名字静态函数;非静态函数可以在另一个文件直接引用。

  • 为什么需要静态全局变量?

    一般在函数中定义的变量,在栈区分配空间,函数退出时胡自动释放,无法保存,而如果定义全局变量来实现,变量就不属于函数本身,不在仅受函数控制,给程序维护带来不便;利用静态全局变量可将其保存在全局数据区,每次值保持到下一次调用,直到下次赋新值。

2. C++中static的特性(面对对象设计中)
  1. 类内静态成员变量

    静态数据成员的特点:

    1. 静态数据成员被当做类成员,无论这个类的对象被定义多少个,静态数据成语在程序中只有一个拷贝,由该类型所有对象共享访问,只分配一次内存;
    2. 存储在全局数据区,静态数据成员定义时要分配空间,所以不能在类声明中定义在Example 5中,语句int Myclass::Sum=0;是定义静态数据成员;
    3. 静态数据成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式为:
    <数据类型><类名>::<静态数据成员名>=<值>
    
    1. 类的静态数据成员有两种访问形式:
    <类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>
    
    1. 静态数据成员主要用在各个对象都有相同的某项属性的时候

    2. 同全局变量相比,使用静态数据成员有两个优势:

      1. 静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其它全局名字冲突的可能性
      2. 可以实现信息隐藏静态数据成员可以是private成员,而全局变量不能

以上是关于static关键字分别在C和C++中的作用的主要内容,如果未能解决你的问题,请参考以下文章

c语言中static关键字

C++入门static关键字

C++中的static关键字的总结

C++中的static关键字的总结

C++中关于static

c++ static关键字的作用