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
    

      

  • 相关阅读:
    C#(99):Queue<T>队列与Stack<T>堆栈
    C#(99):字典Dictionary<Tkey.TValue>与SortedList
    C#(99):列表:List<T>与HashSet和只读集合
    C#(99):C#数组Array
    C#(99):枚举类型与位域枚举Enum
    C#(99):结构类型:Struct
    C#(99):定义类成员(属性、方法、索引、运算符、事件)、接口实现
    C#(99):定义类、System.Object对象、构造函数与析构函数、抽象类与静态类
    SuperSocket.ClientEngine介绍
    C#(99):五、并行编程
  • 原文地址:https://www.cnblogs.com/lifexy/p/8599697.html
Copyright © 2011-2022 走看看