zoukankan      html  css  js  c++  java
  • 类的静态成员变量和静态成员函数

    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;
    }
    

  • 相关阅读:
    洛谷 P2607 [ZJOI2008]骑士(基环树、树形dp)
    洛谷 P1453 城市环路(基环树,树形dp)
    基环树学习笔记 & CF711D Directed Roads
    centos7 系统安全加固方案
    来自后端的突袭? --开包即食的教程带你浅尝最新开源的C# Web引擎 Blazor
    作为一个C#程序员, 你应该上手Kotlin
    python中类和self讲解
    Mysql 存储引擎中InnoDB与Myisam的主要区别
    Apache和Nginx的区别
    PHP超全局变量
  • 原文地址:https://www.cnblogs.com/songhe364826110/p/11546148.html
Copyright © 2011-2022 走看看