C++:静态类成员属性和静态类成员函数

本文探讨了C++中如何使用static修饰类的成员变量和函数,例如静态成员变量total在对象创建与销毁时动态更新。同时,文章强调了静态成员函数不能访问非静态成员以及this指针的限制。通过示例展示了静态成员如何在不同对象间共享数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接着上期const修饰类对象写,本期研究静态成员语法,即static修饰类成员和函数

class A
{
private:
	const string Name;//常量
	int Id;
 
public:
	static int total;//全体学生总数
 
	A(string name, int id) :Name(name), Id(id) { total++; }
	~A() { total--; }
 
	//展示学生信息
	void showInfo()const
	{
		cout << "学号: " << Id
			<< " 姓名: " << Name << endl;
	}
 
	//显示所有学生数量(写类内类外都可以)
	static void show_Total()
	{
		cout << "此时有" << total << "个学生" << endl;
	}
};
 
//必须类外初始化静态成员
int A::total{};//所有由这个类创建的对象全部共享此数据

这里一些涉及到const的语法,不懂的可以去看上期(不懂也不影响本文章观看)C++:枚举循环,全局作用域,子类调用父类函数,const类成员赋值_头发乌黑茂密的博客-优快云博客

这里我们类内声明了一个静态成员变量 total ,这个变量total必须在类外初始化,这里使用{}进行空初始化,也就是0,在构造函数中,每创建一个对象total+1,每析构一个对象,total-1。然后通过静态成员函数show_Total()查看total的值

int main()
{
	//可以不通过对象访问类内静态函数
	A::show_Total();//total=0

	A* p1 = new A("Jack", 1);//创建对象Jack
	p1->show_Total();//total=1

	delete p1;//注销对象Jack
	cout<<A::total<<endl;//total=0
}

静态成员数据(total)和静态函数( show_Total() )既可以通过某个具体类对象(p1)来访问,也可以直接使用类类型(A::)来访问。类静态数据(total)是存储在静态数据区、作用域被限定在类类型中的数据,并且所有类对象共享这一个数据,我们再创建一个对象p2

int main()
{
	//可以不通过对象访问类内静态函数
	A::show_Total();//total=0

	A* p1 = new A("Jack", 1);//创建对象Jack
	p1->show_Total();//total=1

	A* p2 = new A("Rose", 2);//创建对象Rose
	p2->show_Total();//total=2

	p2->total = 100;//通过对象修改值

	//通过另一个对象调用查看值
	p1->show_Total();//total=100

	delete p1;//注销对象Jack
	cout<<A::total<<endl;//total=99
}

可见,通过p2修改total后,通过p1去查看该数据,数据跟修改后是一致的 .

关于这个静态成员函数show_Total(),我们在这个函数里面是不能调用任何非静态类成员属性和非静态类成员函数,而且也不能使用this指针,因为this指针只能在非静态函数内部.我们在这个函数内只能通过类作用域访问其它静态类成员和静态类函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发乌黑茂密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值