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

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

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

4.代码区

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

1、C语言中

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) 静态函数不能被其他文件所用。 

2、C++中

2.1静态数据成员

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

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

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

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

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

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

因为静态数据成员在全局数据区分配内存,属于本类的所有对象共享,所以,它不属于特定的类对象,在没有产生类对象时其作用域就可见,即在没有产生类的实例时,我们就可以操作它; 

2.2静态成员函数

特点:

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

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

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

posted @ 2017-10-04 12:00  Miss.Bueno  阅读(193)  评论(0编辑  收藏  举报