静态成员

作者: 平凡的鱼仔 | 来源:发表于2018-09-16 15:45 被阅读15次

    静态成员分为:

    1.静态数据成员
    2.静态成员函数

    静态成员的特点:

    1.不管创建了多少个对象,它都只有一个副本,这个副本由所有属于这个类的对象共享。
    2.静态成员解决了不同对象间的数据和函数共享问题,不属于任何一个对象,它的作用域是类范围。
    3.静态成员在每个类对象中并不占存储空间,只是在类中分配存储空间,供所有对象使用。每个对象都可以对该类的静态数据成员的值进行更新。
    4.静态数据成员具有静态生存期,必须对它进行初始化。在vs2012环境下,发现这点有问题,在类外定义但不初始化可以通过编译。
    5.公有的静态数据成员可以直接访问,但私有(private)、保护(protected)的必须通过公有接口进行访问。

    静态数据成员初始化的注意事项:

    1.类中的声明只是静态数据成员的引用性声明,应在类体外定义并初始化,静态成员初始化与它的控制权限无关
    2.初始化时不加static,避免和一般静态变量或对象混淆。
    3.由于静态数据成员是类的成员,因此在初始化时必须使用作用域运算符(::)限定它所属的类。
    4.公有的静态数据成员可以直接访问,但私有的或保护的静态数据成员要通过公有的接口进行访问,一般将这个公有的接口定义为静态成员函数。

    所有的变量其实在使用前都要定义,当然,静态成员变量在其中。

    静态成员函数

    静态成员函数属于整个类,不属于类中的任意一个对象。
    静态成员函数既可以在类体内声明,也可以在类体外声明,在类体外声明时不需要加static前缀。静态成员函数在类中只有一个副本,它可以直接访问类中的静态成员,不能直接访问非静态成员;若要访问,必须通过参数传递的方式来获得相应的对象,再通过对象进行访问。
    假如Display()是一个类中的静态成员函数,Point为类名,一般采用Point::Dispaly()的方式调用,而不是用对象.Display()。前者强调了Display()属于某一个类,而不是属于某一个对象。静态成员在类的任何对象建立之前就已经存在了。静态成员在程序内部不依赖于任何对象被访问,即就算没有创建对象,也可以通过类名访问类的公有静态成员。

    上述静态成员特点4的详解

    静态成员的初始化有些小问题,在类外定义了之后其实成员就被分配了内存,不初始化也不报错。

    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    class Student
    {
    public:
        static int a;
    };
    int Student::a;  //类外定义,不进行初始化,静态成员不能定义为局部变量
    int _tmain(int argc, _TCHAR* argv[])
    {
        cout<<Student::a<<endl;  //不报错,这里输出为0,即默认值是0
        getchar();
        return 0;
    }
    
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    
    struct rectangle
    {
        int width;
        int length;
    };
    class Polygon
    {
    public:
        static rectangle rec;
    };
    
    rectangle Polygon::rec; //这种情形不知道怎么初始化,只能进行类外定义
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        return 0;
    }
    
    

    ps:静态、非静态成员函数都可以访问静态数据成员。

    相关文章

      网友评论

        本文标题:静态成员

        本文链接:https://www.haomeiwen.com/subject/vbqfnftx.html