• 第25课 类的静态成员变量


    0.C语言的static关键字

    https://www.cnblogs.com/hoiday/protected/p/9998577.html

    (1)static关键字指明变量“静态”属性——static修饰的局部变量全局变量存储在程序静态区静态变量,只能被初始化一次

    (2)static关键字同时具有作用域限定符

      static修饰的全局变量作用域只是声明的文件中

      static修饰的函数作用域只是声明的文件中

    1. 成员变量的回顾

    (1)通过对象名能够访问public成员变量

    (2)每个对象成员变量都是专属的

    (3)成员变量不能在对象之间共享

    2、新的需求

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

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

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

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

    #include <stdio.h>
    
    class Test
    {
    private:
        int mCount;
    public:
        Test() : mCount(0)
        {
            mCount++;
        }
        ~Test()
        {
            --mCount;
        }
        int getCount()
        {
            return mCount;
        }
    };
    
    Test gTest;
    
    int main()
    {
        Test t1;
        Test t2;
        
        printf("count = %d
    ", gTest.getCount());
        printf("count = %d
    ", t1.getCount());
        printf("count = %d
    ", t2.getCount());
        
        return 0;
    }

    运行结果:

      

    3. 静态成员变量

    (1)C++中的静态成员变量

      ①静态成员变量属于整个类所有

      ②静态成员变量生命期不依赖于任何对象

      ③可以通过对象名,也可以通过类名直接访问公有静态成员变量

      ④所有对象共享类的静态成员变量

    (2)静态成员变量特性

      ①在定义时直接通过static关键字修饰

      ②静态成员变量在程序内部位于全局数据区,所以需要类外为其单独分配空间

      (因为new或栈中的对象只会为非静态成员分配空间,而不会为静态成员分配,所以必须在类外单独为其分配空间

      ③为静态成员变量分配空间语法规则

        Type ClassName::VarName = value;    //要像定义全局变量一样放在函数外

    【编程实验】静态成员变量的使用   25-2.cpp

    #include <stdio.h>
    
                          
    
    class Test
    
    {
    
    private:
    
        static int cCount;
    
     
    
    public:
    
        Test(){cCount++;}
    
     
    
        ~Test(){--cCount;}
    
     
    
        int getCount(){return cCount;}
    
    };
    
     
    
    //使用前必须在类外给静态成员变量分配空间
    
    int Test::cCount = 0; //表明要在全局区,而且只能在全局区分配空间,并初始化为0
    
     
    
    Test gTest; //cCount增加1
    
     
    
    int main()
    {
    
        //int Test::cCount = 0;错误,试图在这里为静态成员分配空间
    
       
    
        Test t1; //cCount增加1
    
        Test t2; //cCount增加1
    
     
    
        printf("sizeof(Test) = %d, sizeof(t1) = %d
    ",
    
                    sizeof(Test), sizeof(t1));        //等于1,表示cCount是在全局区分配空间,
    
                                                      //该变量不属于某个对象本身的。
    
     
    
        printf("count = %d
    ", gTest.getCount());//3,通过对象名访问static成员变量
    
        printf("count = %d
    ", t1.getCount());
    
        printf("count = %d
    ", t2.getCount());
    
     
    
        Test* pt = new Test(); //cCount增加1
    
     
    
        printf("count = %d
    ", pt->getCount()); //4
    
     
    
        delete pt;   //cCount减1
    
     
    
        printf("count = %d
    ", pt->getCount()); //3
    
     
    
        //printf("count = %d
    ", Test::cCount);//错误,通过类名只能访问公有的static成员变量
    
     
    
        return 0;
    
    }

    运行结果:

      

    4. 小结

    (1)中可以通过static关键字定义静态成员变量

    (2)静态成员变量隶属于类所有

    (3)每一个对象都可以访问静态成员变量(可以通过类名和对象访问

    (4)静态成员变量全局数据区分配空间

    (5)静态成员变量的生命期为程序运行期

  • 相关阅读:
    【兼容性】IE不支持日期字符串转换为日期对象
    tinydate.js[v0.2] 优化了调用方式
    tinydate.js[v0.1]关于Javascript Date的工具
    【兼容性】IE10不支持参数默认值即可选参数
    【兼容性】IE10不支持lamda表达式
    创建第一个core项目(netCore学习笔记1)
    .net(C#)在Access数据库中执行sql脚本
    (Lesson2)根据类名称和属性获得元素-JavaScript面向对象
    UWP Tiles
    UWP Ad
  • 原文地址:https://www.cnblogs.com/hoiday/p/10092139.html
Copyright © 2020-2023  润新知