• 第26课 类的静态成员函数


    1、未完成的需求

    • 统计在程序运行期间某个类的对象数目

    • 保证程序的安全性不能使用全局变量

    • 随时可以获取当前对象的数目(Failure

    【编程实验】解决方案的尝试  26-1.cpp

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

    运行结果:

      

    结论:我们需要什么?

    • 不依赖对象就可以访问静态成员变量

    • 必须保证静态成员变量的安全性

    • 方便快捷的获取静态成员变量的值

    2. 静态成员函数

    (1)静态成员函数是类中特殊的成员函数,属于整个类所有

    (2)可以通过类名直接访问公有静态成员函数

    (3)可以通过对象名访问公有静态成员函数

    (4)静态成员函数定义:直接通过static关键字修饰成员函数

          

    【编程实验】静态成员函数示例   26-2.cpp

    #include <stdio.h>
    
     
    
    class Test
    
    {
    
    private:
    
        int i;
    
        static int s_j;
    
    public:
    
     
    
        int getI();
    
        static void StaticFunc(const char* s);
    
        static void StaticSetI(Test&d, int v);
    
        static int StaticGetJ();
    
    };
    
     
    
    int Test::getI()
    
    {
    
        return i;
    
    }
    
     
    
    void Test::StaticFunc(const char* s)
    
    {
    
        printf("StaticFunc: %s
    ", s);
    
    }
    
     
    
    void Test::StaticSetI(Test&d, int v)
    
    {
    
        d.i = v;
    
        //i = v;//静态成员函数不能访问非静态成员变量
    
        s_j = v;//合法,访问静态成员变量
    
    }
    
     
    
    int Test::StaticGetJ()
    
    {
    
        return s_j;
    
    }
    
     
    
    int Test::s_j = 0;
    
     
    
    int main()
    
    {
    
        Test::StaticFunc("main Begin...");//通过类名调用静态成员函数
    
     
    
        Test t;
    
     
    
        Test::StaticSetI(t, 10);
    
     
    
        printf("t.i = %d
    ", t.getI());
    
        printf("s_j = %d
    ", t.StaticGetJ());//通过对象名调用静态成员函数
    
     
    
        Test::StaticFunc("main End...");//通过类名调用静态成员函数    
    
        return 0;
    
    }

    运行结果:

      

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

     

    静态成员函数

    普通成员函数

    所有对象共享

    Yes

    Yes

    隐含this指针

    No

    Yes

    访问普通成员变量/函数

    No

    Yes

    访问静态成员变量/函数

    Yes

    Yes

    通过类名直接调用

    Yes

    No

    通过对象可直接调用

    Yes

    Yes

    【编程实验】解决方案   26-3.cpp

    #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());//0,通过类名调用函数
    
     
    
        Test t1;
    
        Test t2;
    
     
    
        printf("count = %d
    ", t1.getCount());//2, 通过对象名调用函数
    
        printf("count = %d
    ", t2.getCount());//2, 通过对象名调用函数
    
     
    
        Test* pt = new Test();
    
     
    
        printf("count = %d
    ", pt->getCount());//3
    
     
    
        delete pt;
    
     
    
        printf("count = %d
    ", Test::getCount());//2,通过类名调用函数
    
        
    
        return 0;
    
    }

    运行结果:

      

    4. 小结

    (1)静态成员函数是类中特殊的成员函数

    (2)静态成员函数没有隐藏的this参数

    (3)静态成员函数可以通过类名和对象直接访问

    (4)静态成员函数只能直接访问静态成员变量/函数,不能访问普通成员变量/函数

  • 相关阅读:
    另一种遍历Map的方式: Map.Entry 和 Map.entrySet()
    mycat 插入语句导致的一个Dobbo问题
    Json数据处理
    List与字符串转换
    MySQL中四舍五入的实现
    java连接mysql :No Suitable Driver Found For Jdbc 解决方法
    Linux中printf格式化输出
    bat隐藏文件夹
    Python 3.5.2建立与DB2的连接
    Python 爬虫实例
  • 原文地址:https://www.cnblogs.com/hoiday/p/10092150.html
Copyright © 2020-2023  润新知