24、类的静态成员变量

1、成员变量的回顾

  • 通过对象名能够访问 public 的成员变量
  • 每个对象的成员变量都是专属的
  • 成员变量不能在对象之间共享

新的需求:

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

程序:失败的解决方案1

#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\n", gTest.getCount());
	printf("count = %d\n", t1.getCount());
	printf("count = %d\n", t2.getCount());
	return 0;
}

在这里插入图片描述
分析:我们想要打印的结果是3个3,但是程序打印的结果却是3个1。很明显。这个程序不满足要求,那么,这个程序是哪里有问题呢?
问题在于我们定义了一个局部成员变量去++,每个对象都有自己专属的一套成员变量,而且初始化都会置为0,++后都会成为1,这就是问题所在。

失败的解决方案2:

#include <stdio.h>
int gCount = 0;
class Test		
{
private:
	int mCount;
public:
	Test():mCount(0)
	{
		gCount++;
	}
	~Test()
	{
		--gCount;
	}
	int getCount()
	{
		return gCount;
	}

};

Test gTest;

int main()
{
	Test t1;
	Test t2;
	printf("count = %d\n", gTest.getCount());
	printf("count = %d\n", t1.getCount());
	printf("count = %d\n", t2.getCount());
	return 0;
}

在这里插入图片描述
分析:失败的原因在于我们在程序中最好不要用全局变量,因为它是不安全的

2、静态成员变量

  • 在C++中可以定义静态成员变量
    — 静态成员变量属于整个类所有
    — 静态成员变量的生命期不依赖于任何对象(程序的运行周期)
    — 可以通过类名直接访问 公有 静态成员变量(类名::公有静态成员变量名)
    — 所有对象共享类的静态成员变量
    — 可以通过对象名访问 公有 静态成员变量(对象名.公有静态成员变量名)
  • 语法规则:
 Type ClassName::VarName = value

因为静态成员变量不隶属于任何对象,所以我们要在类的外部单独定义它,告诉编译器这个静态成员变量要在全局数据区分配空间。

#include <stdio.h>

class Test		
{
private:
	static int sCount;
public:
	Test()
	{
		sCount++;
	}
	~Test()
	{
		--sCount;
	}
	int getCount()
	{
		return sCount;
	}

};
int Test::sCount = 0;
Test gTest;

int main()
{
	Test t1;
	Test t2;
	printf("count = %d\n", gTest.getCount());
	printf("count = %d\n", t1.getCount());
	printf("count = %d\n", t2.getCount());

	Test* pt = new Test();
	printf("count = %d\n", pt->getCount());
	delete pt;
	printf("count = %d\n", pt->getCount());
	return 0;
}

在这里插入图片描述
用静态成员变量,使得这个程序就很完美了。

小结:

  • 类中可以通过 static 关键字定义静态成员变量
  • 静态成员变量隶属于类所有
  • 每一个对象都可以访问 公有 静态成员变量
  • 静态成员变量在全局数据区分配空间
  • 静态成员变量的生命期为程序运行期
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值