13.C++-静态成员变量、静态成员函数

2018-06-17 20:59:45来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

首先回顾下成员变量

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

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

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

 

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

介绍

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

特性

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

例如:

class Test{

public:
     static int  cnt;              //static修饰,告诉编译器在Test类里有个静态成员变量cnt

};

int Test::cnt = 1;         //在类外初始化,若不赋值则默认置0
int main()
{
 Test::cnt = 100;                      //设置公有静态成员变量cnt=100
 printf("cnt:%d\n",Test::cnt);    
 return 0;
}

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

例如:

 

class Test{
 
public:
     const static int  cnt = 0;       //类内部初始化 
 
};
 
int main()
{ 
 printf("cnt:%d\n",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\n",t1.getCNT());
       printf("count:%d\n",t2.getCNT());   

       t3= new Test;
       printf("count:%d\n",t1.getCNT());

       delete t3;
       printf("count:%d\n",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\n",Test::getCNT());
       Test t1;
       Test t2;
       Test *t3;
       printf("count:%d\n",Test::getCNT());

       t3= new Test;
       printf("count:%d\n",Test::getCNT());

       delete t3;
       printf("count:%d\n",Test::getCNT());
       return 0;
}

运行打印:

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

  

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:BZOJ4872: [Shoi2017]分手是祝愿

下一篇:C++string类总结