原文出处
静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,如:设置全局性的变量或对象是一种方法。但是,全局变量或对象是有局限性的。这一章里,我们主要讲述类的静态成员来实现数据的共享。
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
1、静态数据成员在定义或说明时前面加关键字static。//静态变量的定义
2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
<数据类型><类名>::<静态数据成员名>=<值> //静态变量的初始化
这表明:
下面举一例子,说明静态数据成员的应用:
注意,static成员的初始化要在实现中进行,不能在头文件进行。
从输出结果可以看到Sum的值对M对象和对N对象都是相等的。这是因为在初始化M对象时,将M对象的三个int型数据成员的值求和后赋给了Sum,于是Sum保存了该值。在初始化N对象时,对将N对象的三个int型数据成员的值求和后又加到Sum已有的值上,于是Sum将保存另后的值。所以,不论是通过对象M还是通过对象N来引用的值都是一样的,即为:
54,sA=3。
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员(这点非常重要)。如果静态成员函数中要引用非静态成员时,可通过对象来引用。从中可看出,调用静态成员函数使用如下格式:
不行,因为java中静态的东西是类级别的,也就是说用类名就可访问,也可以用任何对象名访问,无论以哪种形式访问的都是同一个东西。
而一般我们所说的成员变量,是指对象级别的,也就是说每一个对象所拥有的成员变量都是独立的不同的变量,是属于对象自己拥有的。相对于来说访问范围,无疑是静态的更大,静态的可以被任何对象所访问且是同一个,而成员变量是每个对象各自拥有的。
那么,为什么“静态方法不能调用类成员变量”,因为要想访问成员变量你必须有个“已经实例化好的对象”,除非你在静态方法里创建一个当前类的实例对象,否则你是无法直接调用成员变量的,因为它不知道这个成员变量属于哪个实例对象的。
而在成员方法里,所有属于成员的变量、方法已经可以确定是同一个对象的,并且可以用this表示当前对象。
你说的这个问题,我觉得比较难回答。这个是仁者见仁,智者见智的问题。就这个问题而言,哪一方说好都不奇怪。你觉得哪种好,就用哪种。
特别强调的是,要有一颗包容的心,就是说我觉得这种方法好的时候,千万别把另一种方法给抛弃了,能记的尽力记在脑中,顶多是不用罢了。或许哪天,在一个程序解决方案里,你忽然会发现一直在用的这种方法在这里并不好。那是不是可以试下已经被打入冷宫的另一种方法呢,或许会对它有新的认识,进而会产生对这两种方法新的认识。
就我看,程序方法也是很有哲学性的,不存在哪种实现方法或哪个函数特别好,相似的函数永远比不上的这种情况。更多的时候,是各有各的妙用。
另外,就你说的这个问题,我会更倾向于使用成员变量。
最后再强调一下,要有一颗包容的心,事事无绝对。你觉得好的方法就去用,但要经常审视自己一直在用的东西,问一下,是不是可以换一下呢?
1使用场景
对象与对象之间的成员变量是相互独立的要想共用数据,则需要使用静态成员或静态方法
2内存
-静态成员变量在对象创建之前就已经被分配了内存空间
-静态成员变量虽然在类中,但它并不是随对象的建立而分配空间的,也不是随对象的撤销而释放(一般的成员在对象建立时会分配空间,在对象撤销时会释放)静态成员变量是在程序编译时分配空间,而在程序结束时释放空间
4初始化和使用
-静态成员变量要在类的外面进行
-初始化的格式如下:数据类型 类名::静态成员变量名 = 初值;
-可以通过类名来对静态成员变量进行引用,也可以通过对象名来对静态成员变量进行引用
给一个简单的例子
如果成员变量是静态的,那么直接在A类中通过“B变量名称”的形式即可。
如果成员变量是动态的,需要在B类中创建变量的set和get方法,之后在A类中:
B b =new B();进行B类实例化
bsetName("zhangsan");//赋值
bgetName();获取到成员变量值。
滑油;利用气垫。让物体之间脱离接触(如磁悬浮列
C++类支持静态成员变量,在使用的时候,遵循类内声明,类外定义的原则。即在类内部进行声明该变量的类型以及静态属性,但不可以赋初始值,而是要在类外定义,同时赋初始值。
如
class class_type{
static var_type var;
};
var_type class_type::var = init_value;
初始值部分,=init_value可以省略,省略时默认赋值为0。
在使用上:
1 成员函数均可使用静态变量;
2 如果静态变量属性为public,那么任意一个对象a均可使用静态变量var,使用形式为 avar;
3 如果静态变量属性为public,那么可以用如下形式,在类class_type有效的范围内,使用静态变量var:
class_type::var
Java类中的静态变量在程序运行期间,其内存空间对所有该类的对象实例而言是共享的,有些时候可以认为是全局变量。因此在某些时候为了节省系统内存开销、共享资源,可以将类中的一些变量声明为静态变量。
因为静态变量生命周期较长,而且不易被系统回收,因此如果不能合理地使用静态变量,就会适得其反,造成大量的内存浪费,所谓过犹不及。因此,建议在具备下列全部条件的情况下,尽量使用静态变量:
(1)变量所包含的对象体积较大,占用内存较多。
(2)变量所包含的对象生命周期较长。
(3)变量所包含的对象数据稳定。
(4)该类的对象实例有对该变量所包含的对象的共享需求。
如果变量不具备上述特点建议你不要轻易地使用静态变量,以免弄巧成拙。
以上就是关于C++类中静态变量和静态方法使用介绍全部的内容,包括:C++类中静态变量和静态方法使用介绍、java 中类的静态方法怎么调用成员变量、MFC成员变量 静态变量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)