关于C/C++中,对static关键字的理解

准备知识:C/C++的内存分布c++

对于一个完整的程序,在内存中的分布状况以下:  
1.栈区: 由编译器自动分配释放,像局部变量,函数参数,都是在栈区。会随着做用域退出而释放空间。
2.堆区:程序员分配并释放的区域,像malloc(c),new(c++) 
3.全局数据区(静态区):内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。程序结束释放。程序员

4.代码区函数

在不一样的语言环境、或者同一语言不一样上下文环境中,static关键字具备不一样的意思。this

一、C语言中spa

1.1 声明为static的变量具备如下三部分特性:指针

 1)存储位置:存储于静态内存中对象

 2)建立与做用域:静态变量在程序运行以前建立,在程序的整个执行期间始终存在。内存

 3)初始化取值作用域

1.2 类型编译器

1.2.1 静态全局变量:

  1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
  3)做用域:全局静态变量在声明他的文件以外是不可见的,不能被其余文件所共享。准确地讲从定义之处开始到文件结尾。
好处:
定义全局静态变量的好处:
<1>不会被其余文件所访问,修改
<2>其余文件中可使用相同名字的变量,不会发生冲突。

1.2.2静态局部变量:

  1)内存中的位置:静态存储区
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
  3)做用域:做用域仍为局部做用域,当定义它的函数或者语句块结束的时候,做用域随之结束。

1.2.3 静态函数

  函数的定义和声明默认状况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其余文件所用。
定义静态函数的好处:
 1)其余文件中能够定义相同名字的函数,不会发生冲突
 2) 静态函数不能被其余文件所用。 

二、C++中

2.1静态数据成员

在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员.

1)存储位置:静态数据成员存储在全局数据区

2)初始化:在类体外进行初始化。<数据类型><类名>::<静态数据成员名>=<值> 

3)静态数据成员被看成是类的成员。不管这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,由该类型的全部对象共享访问。

4)访问方式:<类对象名>.<静态数据成员名> 或 <类类型名>::<静态数据成员名>

5)在没有产生类的实例时,也能够访问静态数据成员

由于静态数据成员在全局数据区分配内存,属于本类的全部对象共享,因此,它不属于特定的类对象,在没有产生类对象时其做用域就可见,即在没有产生类的实例时,咱们就能够操做它; 

2.2静态成员函数

特色:

1)非静态成员函数能够任意地访问静态成员函数和静态数据成员; 
2) 静态成员函数不能访问非静态成员函数和非静态数据成员; 

3)因为没有this指针的额外开销,所以静态成员函数与类的全局函数相比速度上会有少量的增加; 
4)调用静态成员函数,能够用成员访问操做符(.)和(->)为一个类的对象或指向类对象的指针调用静态成员函数,也能够直接使用以下格式:
<类名>::<静态成员函数名>(<参数表>)

5)出如今类体外的函数定义不能指定关键字static;

相关文章
相关标签/搜索