zoukankan      html  css  js  c++  java
  • 第25课类的静态成员变量

    成员变量的回顾
    通过对象名能够访问public成员变量
    每个对象的成员变量都是专属的
    成员变量不能在对象之间共享 (成员变量一般都设置为私有的)

    新的需求
    统计在程序运行期间某个类的对象数目
    保证程序的安全性(不能使用全局变量)
    随时可以获取当前对象的数目

    解决方案的尝试

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

    上面这种方案显然是失败的。

    可以通过一个全局变量来满足功能,但是不符合用户要求的安全性。为了实现客户的需求,静态变量就要闪亮登场了。

    在C++中可以定义静态成员变量
    ——静态成员变量属于整个类所有
    ——静态成员变量的生命周期不依赖于任何对象
    ——可以通过类名直接访问公有静态成员变量
    ——所有对象共享类的静态成员变量
    ——可以通过对象名访问公有静态成员变量

    静态成员变量的特性
    ——在定义时直接通过static关键字修饰
    ——静态成员变量需要在类外单独分配空间
    ——静态成员变量在程序内部位于全局数据区

    语法规则
    Type ClassName::VarName = value

    如果在类中,这样定义一个static变量:

    private:
        static int mCount;

    会出现编译错误,提示在链接的时候找不到mCount这个变量所对应的存储空间。

    既然是静态成员变量,那么这个变量就不隶属于任何的对象了。因此需要单独定义它,使得编译器知道这个静态成员变量需要在全局数据区分配存储空间。

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

    小结:
    类中可以通过static关键字定义静态成员变量
    静态成员变量隶属于类所有
    每一个对象都可以访问静态成员变量
    静态成员变量在全局数据区分配空间
    静态成员变量的生命周期为程序运行期

  • 相关阅读:
    Http的请求协议请求行介绍
    Http概述
    服务器返回的14种常见HTTP状态码
    Tomcat发布项目
    Tomca的启动与关闭
    TomCat概述
    PrepareStatement
    JDBC的工具类
    JDBC的异常处理方式
    ResultSet
  • 原文地址:https://www.cnblogs.com/-glb/p/11874136.html
Copyright © 2011-2022 走看看