26_类的静态成员函数

0. 未完成的需求

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

1. 问题分析

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

2. 静态成员函数

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

3. 静态成员函数的定义

  • 直接通过static关键字修饰成员函数
class Test
{
 public:
    static void Func1()
    {
    }
    static int Func2();
};

int Test::Func2()
{
    return 0;
}

编程说明:静态成员函数使用

#include 

class Demo
{
private:
    int i;
public:
    int getI();
    static void StaticFun(const char* s);
    static void StaticSetI(Demo& d, int v);
};

int Demo::getI()
{
    return i;
}

void Demo::StaticFun(const char* s)
{
    printf("StaticFun: %s\n", s);
}

void Demo::StaticSetI(Demo& d, int v)
{
    d.i = v;
}

int main()
{
    Demo::StaticFun("main Begin...");
    
    Demo d;
    
//  d.StaticSetI(d, 10);    // 可以通过对象名访问静态成员函数
    Demo::StaticSetI(d, 10);    // 可以通过类名访问静态成员函数
    
    printf("d.i = %d\n", d.getI());

    Demo::StaticFun("main end...");

    return 0;
}

输出结果:

StaticFun: main Begin...
d.i = 10
StaticFun: main end...

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

26_类的静态成员函数_第1张图片

编程说明:最后的解决方案

#include 

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\n", Test::GetCount());   // 0
    
    Test t1;
    Test t2;

    printf("count = %d\n", t1.GetCount());      // 2
    printf("count = %d\n", t2.GetCount());      // 2
    
    Test* pt = new Test();
    
    printf("count = %d\n", pt->GetCount());     // 3
    
    delete pt;
    
    printf("count = %d\n", Test::GetCount());   // 2

    return 0;
}

输出结果:

count = 0
count = 2
count = 2
count = 3
count = 2

5. 小结

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

你可能感兴趣的:(26_类的静态成员函数)