• 18 类的静态成员函数


    1 未完成的需求

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

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

    • 随时可以获取当前对象的数目(Failure)=> 必须借用一个对象才能调用“获取当前对象的数目”的函数

    • 示例:解决方案的尝试

      • Demo

        #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;
        }
        
      • 编译

        count = 0
        count = 1000
        

    2 分析

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

    3 静态成员函数

    • 在 C++ 中可以定义静态成员函数

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

      • 直接通过 static 关键字修饰成员函数
      class Test
      {
      public:
          static void func1(){}
          static int fcun2();
      };
      
      int Test::func2(){
          return 0;
      }
      
    • 示例:静态成员函数使用

      • Demo

        #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;
        }
        
      • 编译运行

        main Begin...
        d.i = 10
        main End...
        
    • 静态成员函数 VS 普通成员函数

      静态成员函数 普通成员函数
      所有对象共享 Yes Yes
      隐含 this 指针 No Yes
      访问普通成员变量(函数) No Yes
      访问静态成员变量(函数) Yes Yes
      通过类名直接调用 Yes No
      通过对象名直接调用 Yes Yes
    • 示例:解决方案

      • Demo

        #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;
        }
        
      • 编译运行

        count = 0
        count = 2
        count = 2
        count = 3
        count = 2
        
  • 相关阅读:
    AdvDataList分页 例码
    问一个关于生成静态页面的问题
    使用XMLDataSource简单实现多级下拉菜单
    简单的封装一个HTML 弹出对话框的空间
    JS 语言强大, 动态修改标准库
    Eclipse IDE 学习
    分布式程序的开发
    Http request Post pk Put
    Forward: X Forwarding with Putty on Windows
    转载: 颠覆了对于design 的认识
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13721252.html
Copyright © 2020-2023  润新知