• 类的静态成员变量和静态成员函数


    1. 静态成员变量

    先来回顾一下普通成员变量

    • 通过对象名能够访问public成员变量
    • 每个对象的普通成员变量都是专属的,不能在对象之间共享

    在C++中还可以定义静态成员变量

    • 静态成员变量属于整个类所有,所有对象共享类的静态成员变量
    • 静态成员变量的生命周期不依赖于任何对象
    • 可以通过类名对象名访问public静态成员变量

    静态成员变量的定义

    • 静态成员变量在类的内部声明,声明时直接通过static关键字修饰
    • 静态成员变量在类的外部定义与初始化,语法规则为Type ClassName::VarName = value;
    • 静态成员变量不占用类的大小,而是在类外(全局数据区)单独分配空间
    #include <stdio.h>
    
    class Test
    {
    private:
        static int c;
    };
    
    int Test::c = 0;
    

    2. 静态成员函数

    与静态成员变量类似,静态成员函数是类中特殊的成员函数

    • 静态成员函数属于整个类所有
    • 可以通过类名对象名访问public静态成员函数
    • 静态成员函数只能访问静态成员变量和静态成员函数
    class Demo
    {
    public:
        static void StaticFunc(const char *s)
        {
            printf("StaticFunc: %s
    ", s);
        }
    
        static void StaticSetI(Demo &d, int v);
    };
    
    void Demo::StaticSetI(Demo &d, int v)
    {
        d.i = v;
    }
    

    静态成员函数 VS 普通成员函数

    3. 实战练习

    实现如下需求

    • 统计在程序运行期间某个类的对象数目
    • 不能使用全局变量
    • 随时可以获取当前对象的数目
    #include <stdio.h>
    
    class Test
    {
    private:
        static int cCount;
    public:
        Test();
        ~Test();
        static int GetCount();
    };
    
    int Test::cCount = 0;
    
    Test::Test()
    {
        cCount++;
    }
    
    Test::~Test()
    {
        --cCount;
    }
    
    int Test::GetCount()
    {
        return cCount;
    }
    
    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;
    }
    

  • 相关阅读:
    GCC编译错误小结
    Sword libcurl使用
    Python 包
    Python __all__系统变量
    Python 模块导入
    Python 异常处理
    Python 单例模式
    乐乐课堂_leleketang.com
    靠刷题考进了清华?学霸告诉你答案
    python logging配置时间或大小轮转
  • 原文地址:https://www.cnblogs.com/songhe364826110/p/11546148.html
Copyright © 2020-2023  润新知