c++关键字:(三)static

来源:互联网 发布:ztree导出json 编辑:程序博客网 时间:2024/06/08 03:13

一、static变量

1、静态局部变量

  1)该变量在全局数据区分配内存; 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束,但它始终驻留在全局数据区(此时其他函数不能引用它),直到程序运行结束。(非静态局部变量函数调用结束后即释放)

  2)静态局部变量在编译时被初始化,即以后的函数调用不再进行初始化;(非静态的在调用时进行初始化,每调用一次重新赋值一次) 

  3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0(对数值型变量)或空字符(对字符型变量)。(非静态变量,如果不赋初值,则它的值是不确定的,这是因为每次调用结束后存储单元已释放,下次调用时又重新分配,而重新分配的值是不确定的)

2、静态全局变量: 

  1)该变量在全局数据区分配内存;只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它(非静态全局变量的作用域是整个源程序(多个源文件可以共同使用))。

  2)未经初始化的静态全局变量会被程序自动初始化为0(自动变量的值是随机的,除非它被显式初始化)

二、函数中的static

1、静态函数

  1)static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用(区别于一般的非静态函数(外部函数))

  2)使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

  3)静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。

三、类中的static

1、静态数据成员

  1)全局变量与静态数据成员

  ①全局变量可以被一个程序中的所有函数共享,修改。静态数据成员的作用域只限于定义该类的作用域,可以被同类的多个对象共享

  ②全局变量没有实现封装性。静态数据成员可以是private成员,而全局变量不能

   2)静态数据成员被当作是类的成员,只分配一次内存。无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一份拷贝,可以被该类的所有对象共享访问。如果改变它的值,则在各对象中的值都同时改变了( 对于非静态数据成员,每个类对象都有自己的拷贝)

   3)静态数据成员在所有对象之外单独开辟空间。它不随对象的建立而分配空间,也不随对象的撤销而释放。静态数据成员是在程序编译时被分配空间的,在程序结束时才释放。只要在类中定义了静态数据成员,即使不定义对象,也为静态数据成员分配空间,它可以被引用。(只声明了类而未定义对象,则类的非静态数据成员是不占内存空间的。类的非静态数据成员只有在定义对象时,才为对象的数据成员分配空间)

  4)静态数据成员定义时要分配空间,所以不能在类声明中定义。静态数据成员只能在类体外进行初始化

静态数据成员初始化的格式为:

<数据类型><类名>::<静态数据成员名>=<值> 

例:

int Myclass::Sum=10;

注意:不能用参数初始化列表对静态数据成员进行初始化。因为:参数初始化列表是在调用构造函数之前调用,即在定义对象的时候调用。而静态数据成员在定义时即初始化。

  5)静态数据成员和普通数据成员一样遵从public,protected,private访问规则;

定义为私有的静态数据成员必须通过类的公用成员函数引用

  6) 类的静态数据成员有两种访问形式:

<类对象名>.<静态数据成员名>

 或 <类类型名>::<静态数据成员名>(如果静态数据成员的访问权限允许的话(即public的成员))

2、静态成员函数:

  1)在类中声明函数的前面加上static就成了静态成员函数。如:static intvolume();出现在类体外的函数定义不能指定关键字static

  2)静态成员函数是类的一部分而不是对象的一部分。类的公用成员成员函数在类外可以直接用类名和域运算符访问。例:Box::volume();

也可以通过对象名调用。例:a.volume();

  3)静态成员函数与非静态成员函数的本质区别是:非静态函数有this指针而静态成员函数没有this指针。因此静态成员函数不能默认的访问类的非静态成员,因为无法知道该去找哪个对象。如果一定要访问,需要加上对象名和成员运算符.

  4) 非静态成员函数可以任意地访问静态成员函数和静态数据成员; 

  5)静态成员函数的作用是为了能处理静态数据而不是为了对象之间的沟通。所以静态成员函数最好只访问静态成员。

0 0