您的位置:首页 > 其它

static关键字理解整理:静态变量、静态函数的作用及使用规则

2014-09-19 13:43 351 查看
static的作用:
a. 用于全局变量时,使变量的作用域限制在一个文件内(相比于限制了作用范围的全局变量)
b. 用于类成员变量时,代表该变量属于类的(即所有对象共享这个变量)
c. 用于函数内部的局部变量时,能保证函数退出作用域后不回收其空间(即其值保持不变),始终对该函数可见
d. 用于函数时,使函数只在一个文件内可访问
e. 用于类成员函数时,代表该函数为整个类所有,各对象共用。注意,该函数不接收this指针,也意味着不能调用一般的成员函数或者变量
 
使用规则:
静态成员变量存放在静态存储区,在内存中只存在一份(区别:非静态函数的空间分配是在你实例化对象时创建的,会在每个被调用中维持一份拷贝),只在第一次调用的时候被初始化一次,所有对象共享,直到程序结束。

静态成员变量使用前必须先初始化(默认初始值为0),但只能在类体外进行初始化。因为静态成员不属于某一个对象独有,所以不能通过构造函数对其进行初始化。
静态成员函数在类外实现时候无须加static关键字,否则是错误的。

静态成员不应在类体内进行赋值,因为它是被所有该类的对象所共享的。你在一个对象里给它赋值,其他对象里的该成员也会发生变化。为了避免混乱,所以不可在类体内进行赋值。

静态成员可通过类名或对象名访问(可使用使用”.”或”->"),非静态成员只能通过对象来访问。
静态成员仍然遵循public,private,protected访问准则。

非静态成员函数可以任意地访问静态成员函数和静态数据成员。
静态成员函数中必须通过对象名来访问非静态数据成员。

由于没有this指针的额外开销,因此静态成员函数与类的全局函数相比速度上会有少许的增长。

使用范围:
静态全局变量只在定义该变量的源文件内有效。
普通静态函数只能在本文件中使用。只在当前源文件中使用的函数应该说明为静态函数,然后在当前源文件中说明和定义。
静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如 :
Box∷fun( );
实际上也允许通过对象名调用静态成员函数,如:
a.fun( );
但这并不意味着此函数是属于对象a的,而只是用a的类型而已。

静态函数权限:
静态成员函数与非静态成员函数的根本区别是: 非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。因而,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。如果不想让成员函数访问或者修改对象(非static)数据成员,则将成员函数声明为static比较好。注意:如果static int func(....)不是出现在类中,则它不是一个静态成员函数,只是一个普通的全局函数,只不过由于
static 的限制,它只能在本文件中使用。
但是,静态成员函数并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要在静态成员函数中引用本类的非静态成员,应该加对象名和成员运算符“.”。如:
cout<<a.width<<endl;            //引用本类对象a中的非静态成员
假设a已定义为Box类对象,且在当前作用域内有效,则此语句合法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐