`

静态成员和方法的使用场合及利弊分析

阅读更多

 

转自:http://www.cnblogs.com/jes_shaw/p/3148629.html

数据成员

数据成员可以分静态变量、实例变量两种.
静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.
实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.


函数成员
方法可以主要分为静态方法,实例方法
静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变量做为参数传给静态方法。静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。
实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,实例方法可以直接访问实例方法、和静态方法,静态方法的访问方式为类名加点操作符加变量名。当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。

静态的东西,在构造的时候是在堆中生成,在结束前不会被释放与改变.
大量的数据访问 由于已经生成且不被释放,所以就不会在栈中反复创建实例,节约空间时间。
非静态的反复调用方法 有可能造成使用过的变量或方法被系统回收,而再创建的问题。
对于大数据量的访问操作,应该使用静态方法,可以提高性能。
如果一个方法不需要实例就能很好的运行,那它本来就该是静态的,除非是你故意把它写成非静态的,所以这个效率是无稽之谈。


静态方法的使用场合
一、该方法与任何实例无关。
二、该方法与特定实例无关。
三、该方法是运算符。
四、该方法不修改实例。
不过,除了第一条和第三条是亘古不变的之外,第二第四都是见仁见智的了。 


关于静态方法
1、static声明的变量和方法会被放到内存的堆区,即使不调用也会被分配空间,而非static情况只有在使用的时候才被分配空间,使用完就释放掉。
2、static不需要你创建一个实例就可以调用。

当一个类的成员被声明为static时,它可以在这个类的对象被创建之前且没有任何对象的引用存在时被访问。因此,static成员多数被用于全局目的。可以将方法和变量都声明为static。当载入一个类时,一个又一个static块只执行一次。也就是说一些比较通用在系统中应用的比较广泛的函数,一般是采用静态方法。而不太通用的函数则可以使用非静态方法,因为在系统中使用的不是很多,不象通用函数那么广泛。实例化反而比静态方法更适合一些,它实例化所消耗的资源就可能比静态方法消耗的资源要少一些。所以一般都是根据实际需求来决定是否采用静态方法。

===================================================

用C#写程序,或者用一门oo语言写程序,你首先应该分清楚什么时候用静态函数,什么时候需要用成员函数。
如果不加区分,抛弃了oo意义,只是为了少许的提升性能的话,那么我建议你别用c#了,用C写,你获得性能提高会更多,可以说不是一个数量级的。

其次,就静态函数与静态成员的内存消耗、所带来的性能提高,以及由哪些危害,我大致提一下。
对于内存消耗来说,一般看似只有静态成员会消耗,而静态函数不会。
但是调用一个类的静态函数,类的静态成员如果没有初始化的话,是需要初始化的,也就是说静态函数的调用会对静态成员进行初始化,也就是潜移默化的造成内存损耗。
对于性能提高而言,
首先说说静态函数的调用,大致形式如下:
类名.方法名
调用步骤大致如下
1、通过类名找到类型table
2、通过类型table找到要调的函数指针,进行调用。
而对于成员函数,大致形式如下:
对象名.方法名
调用步骤大致如下
1、通过对象名找到类型table地址
2、通过类型table地址找到类型table
3、通过类型table找到要调的函数指针,进行调用。
也就是说调用成员函数要比静态函数多调用一个步骤,这里可以说是成员函数的性能不如静态函数的地方。

最后说说纯粹为了性能,而滥用静态函数的危害。
就像我前面举例的那样,不要为了静态函数而用静态函数,而大量产生如下的形式
public   class   UglyClass
{
        public   static   void   UglyMethod(   UglyClass   data   );
}
再说危害之前,首先说说静态函数所能访问到的数据,大致有两种
1、静态成员;
2、参数;
如果使用静态成员来传递数据的话,这你就要小心了,尤其是多线程的操作时候,操作不好的时候会产生相互干扰,而且这种问题你很难查出来。
如果使用参数来作为传递数据的方法,
首先参数列表显得臃肿,把本来不该传进的进行传递;
其次参数的读写操作,和静态成员一样,多线程操作的时候,也会出现相互干扰。
而这些在静态函数所产生的潜在危害,对于类的成员函数来说,可以最大的避免。
好了,不在多说了,
对于是否使用静态函数,还是那一点建议,即你首先区分什么函数应该用静态函数实现,什么函数不应该用它来实现。

分享到:
评论

相关推荐

    实现易语言类静态数据成员的方法

    易语言的学习者在论坛中讨论这类问题时,可能会遇到如何在类的方法中正确使用静态数据成员的问题。记住,静态数据成员在所有实例方法中都可以直接访问,而无需通过`this`关键字引用。同时,由于静态数据成员不随对象...

    易语言源码实现易语言类静态数据成员的方法.7z

    易语言是一种专为中国人设计的编程语言,它以简明直观的中文语法,降低了编程的门槛,...静态数据成员在设计和实现一些需要全局共享状态或计数器等功能时非常有用,但应谨慎使用,避免造成不必要的复杂性和潜在的问题。

    C++类中的静态成员变量和静态成员函数的作用

    ### C++类中的静态成员变量和静态成员函数的作用 #### 静态成员变量与静态成员函数概述 在C++编程语言中,类是面向对象编程的基础,它允许程序员定义包含数据成员(变量)和成员函数(方法)的复合数据类型。其中...

    C++类与对象:static静态数据成员静态成员函数.doc

    C++中的静态数据成员和静态成员函数为开发者提供了强大的工具,用于管理和优化数据共享以及封装类级的公共功能。合理利用这些特性,可以显著提升代码的质量和性能,同时保持良好的封装性和安全性。然而,使用时也应...

    面向对象c++静态成员的使用

    下面我们将通过一个具体的例子来详细了解静态成员的定义、初始化以及如何在构造函数和析构函数中使用它们。 #### 代码分析 首先,我们来看一下给定的代码片段: ```cpp #include #include class point { private...

    static 的使用场合

    下面将详细说明`static`关键字的使用方法和适用场合。 1. **静态变量(Static Variables)** - `static`关键字用于声明类变量,这些变量属于类本身而不是类的实例。因此,无论创建了多少个对象,静态变量只有一份...

    静态成员变量和静态成员函数

    在编程语言中,如C++或Java,`static`关键字有着重要的作用,它主要用于定义静态成员变量和静态成员函数。本文将深入解析`static`的关键特性,并探讨它们在面向过程和面向对象编程中的应用。 首先,静态成员变量,...

    C++静态成员函数的说明及使用

    在理解和使用静态成员函数时,有以下几个关键知识点: 1. **定义**: 静态成员函数的定义与普通成员函数不同,需要在函数声明前加上`static`关键字。例如: ```cpp class MyClass { public: static void ...

    静态方法,静态成员变量的调用

    在Java编程语言中,静态方法和实例方法是两种不同类型的成员,它们在使用和功能上有所区别。静态方法是属于类级别的,而实例方法是属于对象级别的。理解这两种方法的特性对于编写高效的代码至关重要。 首先,调用...

    C#静态方法与非静态方法的比较

    - **成员访问**:静态方法只能访问静态成员(包括静态字段、静态属性和静态方法),不能直接访问实例成员;实例方法可以访问所有成员(静态和实例)。 #### 三、代码示例与实践 **1. 获取当前方法所在的类名** 在...

    C++静态成员函数小结

    C++静态成员函数小结 静态成员函数是C++中一个非常重要的概念,特别是在类设计和对象编程中。静态成员函数可以分为两部分:静态数据成员和静态函数...但是,需要注意静态成员函数的特点和限制,以便更好地使用它们。

    PHP中静态方法(static)与非静态方法的使用及区别.docx

    3. 访问限制:静态方法和属性不能直接访问非静态的成员,因为它们可能在没有实例的情况下被调用。 了解这些区别有助于优化代码设计,选择最适合的方法来处理不同场景下的问题。在实际开发中,合理使用静态和非静态...

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...

    java笔记静态成员

    静态成员包括静态变量、静态方法和静态初始化块。 1、静态变量 静态变量是指属于类的变量,它们的值是共享的,所有实例都可以访问到同一个静态变量。在上面的代码中,`static int z;`就是一个静态变量。静态变量是...

    静态数据成员与子对象

    在编程中,静态数据成员和静态成员函数是类的一个重要特性,它们与普通的成员变量和成员函数有所不同。静态数据成员属于类,而不是类的每个实例,这意味着所有类的实例共享同一份静态数据成员的副本。这使得静态数据...

    C++静态成员变量和静态成员函数

    静态成员变量和静态成员函数都是C++中非常有用的特性,它们可以帮助我们更有效地管理和组织代码。通过合理地利用这些特性,可以显著提高程序的性能并简化代码结构。无论是实现对象计数还是执行与类相关的操作,这些...

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    以下是关于Java成员变量、局部变量、静态变量以及成员方法和全局方法的基本概念和区别的详细阐述。 1. 成员变量(Member Variables): 成员变量是类的一部分,它们定义了对象的状态。它们可以是实例变量(非静态...

    C++静态成员变量和静态成员函数的使用方法总结

    在C++编程语言中,静态成员变量和静态成员函数是类的重要组成部分,它们与非静态成员有着显著的区别。本文将详细解析这两种特性的使用方法。 首先,我们来看静态成员变量。静态成员变量是通过在变量声明前加上`...

    java 利用反射获取内部类静态成员变量的值操作.docx

    2. **查找静态字段**:接着,使用`Class`对象的`getDeclaredField`方法找到所需的静态成员变量。 3. **访问静态字段**:最后,通过`Field`对象的`get`方法来获取静态成员变量的值。 ##### 代码示例 ```java import ...

Global site tag (gtag.js) - Google Analytics