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类对象,且在当前作用域内有效,则此语句合法。
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类对象,且在当前作用域内有效,则此语句合法。
相关文章推荐
- Static关键字的作用及使用
- 深入理解Java中static关键字的使用
- C++语言中 关键字typedef的作用及其使用规则
- static 关键字 成员变量和静态变量的区别 静态使用的注意事项 静态代码块 构造代码块
- 什么是静态代码块?java中如何使用空参构造方法自动生成不同名字的对象,使用非静态的属性和静态属性有什么区别,原因是什么?如何理解static关键字
- java定义静态变量的作用 static关键字
- static 静态变量和静态函数的使用探究 类::functionname 与 初始化一个对象的区别
- C语言中static的作用及C语言中使用静态函数有何好处
- C语言中static的作用及C语言中使用静态函数有何好处
- 简述static关键字的作用?(备注:在什么条件下使用static修饰局部变量、全局变量、函数)
- C#学习笔记之六 类定义中static关键字的用法暨C#中静态变量的意义与使用
- 【自我修养】理解static关键字的使用
- static(c中定义的关键字1、被其修饰者 外部无法使用(相反的都可以使用extern在外部使用) 2、函数局部变量使用成为静态的放入静态池-生存期改变。c++进行了扩充,使它在类中有了特殊作用)
- Java面向对象基础--Static关键字的作用及使用
- this的使用方法和static关键字的作用
- Java关键字final、static使用
- Java关键字final、static使用总结
- Java关键字final、static使用总结
- Java关键字final、static使用总结
- Java关键字final、static使用总结