zoukankan      html  css  js  c++  java
  • 13.C++-静态成员变量、静态成员函数

    首先回顾下成员变量

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

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

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

    再来讲讲类的静态成员变量

    介绍

    • 静态成员变量属于整个类所有
    • 静态成员变量的生命期不依赖于任何对象(如同全局变量)
    • 可以通过类名直接访问公有(public)静态成员变量
    • 所有对象共享类的静态成员变量
    • 可以通过对象名访问公有(public)静态成员变量

    特性

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

    例如:

    class Test{
    
    public:
         static int  cnt;              //static修饰,告诉编译器在Test类里有个静态成员变量cnt
    
    };
    
    int Test::cnt = 1;         //在类外初始化,若不赋值则默认置0,写为:int Test::cnt;
    int main()
    {
     Test::cnt = 100;                      //设置公有静态成员变量cnt=100
     printf("cnt:%d
    ",Test::cnt);    
     return 0;
    }

    如果static成员时const类型,则可以直接在类内部初始化赋值

    例如:

    class Test{
     
    public:
         const static int  cnt = 0;       //类内部初始化 
     
    };
     
    int main()
    { 
     printf("cnt:%d
    ",Test::cnt);   
     return 0;
    }

    接下来做一个小实例

    在程序运行时, 可以随时查询到某个类的对象的个数

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

    代码如下:

    #include "stdio.h"
    
    class Test{
    
    private:
         static int  cnt;      
    
    public:
           Test()
           {
                  cnt++;
           }
           ~Test()
           {
                  cnt--;
           }
           int getCNT()
           {
                  return cnt;
           }
    };
    
    int Test::cnt = 0;         //在类外赋值,使其分配空间
    
    int main()
    {
           Test t1;
           Test t2;
           Test *t3;
    
           printf("count:%d
    ",t1.getCNT());
           printf("count:%d
    ",t2.getCNT());   
    
           t3= new Test;
           printf("count:%d
    ",t1.getCNT());
    
           delete t3;
           printf("count:%d
    ",t1.getCNT());
         
           return 0;
    } 

    运行打印:

    count:2
    count:2
    count:3
    count:2

    运行后,可以发现已经能够统计对象个数了.

    但是还有缺点,调用这个getCNT()函数时,前提还要有个对象才行.

    假如程序里没有对象了,就根本无法查询到count值.

    所以我们还需要使用类的静态成员函数来完善它

    静态成员函数

    介绍

    • 静态成员函数属于整个类所有
    • 静态成员函数没有隐含this指针,无法直接访问非静态成员变量
    • 可以通过类名对象名访问公有静态成员函数

    静态成员函数定义和成员函数类似,唯一区别是,在类里定义时需要在前面加static关键字

    例如:

    class Test{
    
    public:
           static int func()  {                //定义func静态成员函数
           //... ...
           return 0;
        }             
    }

    或者:

    class Test{
    
    public:
           static int func();        //定义func静态成员函数
    
    }
    
    int Test::func() 
    {
    //... ...
    return 0;
    }
    

      

    接下来完善上面实例,使用静态成员函数获取统计个数

    #include "stdio.h"
    
    class Test{
    private:
         static int  cnt;      
    public:
           Test()
           {
                  cnt++;
           }
    
           ~Test()
           {
                  cnt--;
           }
    
        static int getCNT()
           {
                  return cnt;
           }
    };
    
    int Test::cnt = 0;         //在类外赋值,使其分配空间
    
    int main()
    {
           printf("count:%d
    ",Test::getCNT());
           Test t1;
           Test t2;
           Test *t3;
           printf("count:%d
    ",Test::getCNT());
    
           t3= new Test;
           printf("count:%d
    ",Test::getCNT());
    
           delete t3;
           printf("count:%d
    ",Test::getCNT());
           return 0;
    }

    运行打印:

    count:0
    count:2
    count:3
    count:2
    

      

  • 相关阅读:
    springmvc
    POJ 3683 Priest John's Busiest Day
    POJ 3678 Katu Puzzle
    HDU 1815 Building roads
    CDOJ UESTC 1220 The Battle of Guandu
    HDU 3715 Go Deeper
    HDU 3622 Bomb Game
    POJ 3207 Ikki's Story IV
    POJ 3648 Wedding
    HDU 1814 Peaceful Commission
  • 原文地址:https://www.cnblogs.com/lifexy/p/8599697.html
Copyright © 2011-2022 走看看