• 第26课 静态成员函数


    未完成的需求
    统计在程序运行期间某个类的对象数目
    保证程序的安全性(不能使用全局变量)
    随时可以获取当前对象的数目(failure)

    假设程序中没有Test对象,你就无法获取当前对象的数目。因为在上一个程序中是使用对象去调用成员函数的,此时如果没有对象,如何去调用呢?

    解决方案1:

    #include <stdio.h>
    
    class Test
    {
    public:
        static int cCount;
    public:
        Test()
        {
            cCount++;
        }
        ~Test()
        {
            --cCount;
        }
        int getCount()
        {
            return cCount;
        }
    };
    
    int Test::cCount = 0;
    
    
    int main()
    {
        printf("count = %d
    ", Test::cCount);
        
        Test::cCount = 1000;
        
        printf("count = %d
    ", Test::cCount);
        
        return 0;
    }

    上述程序,虽然可以统计出对象的数目(即使是在没有定义对象的情况下),但是从Test::cCount = 1000可以看出,非常不安全,还是不满足要求。那如何来解决呢?

    我们需要什么?

    不依赖对象就可以访问静态成员变量
    必须保证静态成员变量的安全性
    方便快捷的获取静态成员变量的值

    在C++中可以定义静态成员函数
    ——静态成员函数是类中特殊的成员函数
    ——静态成员函数属于整个类所有
    ——可以通过类名直接访问公有静态成员函数
    ——可以通过对象名访问公有静态成员函数

    #include <stdio.h>
    
    class Demo
    {
    private:
        int i;
    public:
        int getI();
        static void StaticFunc(const char* s);
        static void StaticSetI(Demo& d, int v);
    };
    
    int Demo::getI()
    {
        return i;
    }
    
    void Demo::StaticFunc(const char* s)
    {
        printf("StaticFunc: %s
    ", s);
    }
    
    void Demo::StaticSetI(Demo& d, int v)
    {
        d.i = v;
    }
    
    int main()
    {
        Demo::StaticFunc("main Begin...");
        
        Demo d;
        
        Demo::StaticSetI(d, 10);
        
        printf("d.i = %d
    ", d.getI());
        
        Demo::StaticFunc("main End...");
        
        return 0;
    }

    #include <stdio.h>
    
    class Test
    {
    private:
        static int cCount;
    public:
        Test()
        {
            cCount++;
        }
        ~Test()
        {
            --cCount;
        }
        static int GetCount()
        {
            return cCount;
        }
    };
    
    int Test::cCount = 0;
    
    int main()
    {
        printf("count = %d
    ", Test::GetCount());
        
        Test t1;
        Test t2;
        
        printf("count = %d
    ", t1.GetCount());
        printf("count = %d
    ", t2.GetCount());
        
        Test* pt = new Test();
        
        printf("count = %d
    ", pt->GetCount());
        
        delete pt;
        
        printf("count = %d
    ", Test::GetCount());
        
        return 0;
    }

    小结:
    静态成员函数是类中特殊的成员函数
    静态成员函数没有隐藏的this参数
    静态成员函数可以通过类名直接访问
    静态成员函数只能直接访问静态成员变量(函数)

  • 相关阅读:
    cesium【02-小部件】
    cesium【01-初始化】
    【01】webpack4 快速上手
    【11】openlayers 地图交互
    【10】openlayers 视图view
    【09】openlayers 图片图层
    【08】openlayers 热力图层
    【07】openlayers 矢量图层
    测试从业人员常用的数据库技能整理
    基于web网站项目的性能测试结果分析
  • 原文地址:https://www.cnblogs.com/-glb/p/11874587.html
Copyright © 2020-2023  润新知