C++非类中和类中的static的作用

一、非类中的static

1、隐藏

        static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。

2、保持局部变量持久性

        在修饰变量的时候,static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。

3、static变量默认初始化为0

        static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0(自动变量的值是随机的,除非它被显式初始化)。

 

二、类中的static

1、静态数据成员

        (1)静态数据成员不属于对象,属于类,所有实例对象共用一份。因此,初始化时使用作用域运算符来标明它所属类。可以实现多个对象之间的数据共享,又因为它在内存中只占一份空间,如果改变它的值,则各对象中这个数据成员的值都被改变。 

的静态数据成员既可以通过对象名引用,也可以通过类名引用:

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

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

如果静态数据成员的访问权限允许的话(即public的成员),可在程序中,按上述格式来引用静态数据成员。

应用:

        需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见。

        静态数据成员主要用在各个对象都有相同的某项属性的时候。比如对于一个存款类,每个实例的利息都是相同的。所以,应该把利息设为存款类的静态数据成员。这有两个好处,第一,不管定义多少个存款类对象,利息数据成员都共享分配在全局数据区的内存,所以节省存储空间。第二,一旦利息需要改变时,只要改变一次,则所有存款类对象的利息全改变过来了。

        (2)静态数据成员必须在类外初始化。当然,如果在加上关键const, 则是可以在类中进行初始化的。

  • a、初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆;
  • b、初始化时不加该成员的访问权限控制符private,public等;        
  • c、初始化时使用作用域运算符来标明它所属类;
  • d、由于静态成员声明于类中,操作于其外,所以对其取地址操作,就多少有些特殊 ,变量地址是指向其数据类型的指针 ,函数地址类型是一个“nonmember函数指针”。

        静态数据成员初始化的格式:<数据类型><类名>::<静态数据成员名>=<>

        (3)静态数据成员是在程序开始运行时被分配空间,到程序结束之后才释放,只要类中指定了静态数据成员,即使不定义对象,也会为静态数据成员分配空间。

       (4)为了防止父类的影响,可以在子类定义一个与父类相同的静态变量,以屏蔽父类的影响这里有一点需要注意:我们说静态成员为父类和子类共享,但我们有重复定义了静态成员,这会不会引起错误呢?不会,我们的编译器采用了一种绝妙的手法:name-mangling 用以生成唯一的标志。

 

2、静态成员函数

        (1)类的静态成员函数是属于整个类而非类的对象,所以它没有this指针,这就导致了它仅能访问类的静态数据成员和静态成员函数。

       静态方法属于类,而不是类实例,访问静态方法不需要一个实例,而非静态方法的访问,必须要先实例化一个对象,所以避免非静态方法的访问错误,不在静态方法调用非静态的东西。

  • a、非静态的成员函数可以任意的访问静态数据成员和静态成员函数。
  • b、由于没有this指针的额外开销,静态成员函数与类的非静态成员函数相比速度上会有少许的增长。

       (2)不能将静态成员函数定义为虚函数。

        因为静态成员函数属于类,在内存中只有一份。而虚函数必须根据对象类型才能知道调用哪一个虚函数,故虚函数是一定要在对象的基础上才可以的,两者一个终归属于类,一个必依赖于对象,那么终归是不能合二为一的 。

       (3)静态成员函数不能声明为const。

        const 修饰成员函数表示 该成员函数不会修改某个该函数所属的对象(const修饰的成员方法必须有this指针),static不属于任何对象,没有this指针。

        (4)由于静态成员函数没有this指针,所以就差不多等同于nonmember函数,结果就 产生了一个意想不到的好处:成为一个callback函数,使得我们得以将C++和C-based X W indow系统结合,同时也成功的应用于线程函数身上。

猜你喜欢

转载自blog.csdn.net/King_weng/article/details/84098531