【C++入门】静态成员详解(定义、实现原理、使用注意事项)

1、类的静态成员

(1)在类中用static修饰成员,则该成员是静态成员;
(2)静态成员是属于类本身的,所有类的对象共享;
(3)类的对象都可以访问静态成员,但是所有类的成员访问的静态成员都是同一份静态成员;
(4)静态成员在类内部声明时加static声明,在类外定义静态成员时无需添加static修饰;

2、静态成员的使用场景

(1)因为静态成员是属于类而不是属于单个对象的,所以静态成员用来记录类相关的信息;
(2)比如:用静态成员来统计创建了多少个类的对象;

3、、静态成员使用

3.1、示例代码

#include <iostream>

using namespace std;

class Person
{
private:

public:
	int age;			// 普通成员变量
	static int cnt;		//统计程序存在的中类的对象个数
	
	Person(void);	//构造函数
	~Person(void);	//析构函数
};

//在构造函数中cnt加一
Person::Person(void)
{
	age = 18;
	Person::cnt++;	//方式1
	//cnt++;		//方式2
	//this->cnt++;	//方式3
}

//在析构函数中cnt减一
Person::~Person(void)
{
	Person::cnt--;
}

// 对Person类中的静态成员定义		
int Person::cnt;	

int main(void)
{
	cout << "Person::cnt = " << Person::cnt << endl;
	
	Person *p1 = new Person();

	cout << "Person::cnt = " << Person::cnt << endl;
	Person *p2 = new Person();

	cout << "Person::cnt = " << Person::cnt << endl;
	Person *p3 = new Person();

	cout << "Person::cnt = " << Person::cnt << endl;
	
	delete(p1);
	cout << "Person::cnt = " << Person::cnt << endl;

	delete(p2);
	cout << "Person::cnt = " << Person::cnt << endl;

	delete(p3);
	cout << "Person::cnt = " << Person::cnt << endl;
	
	return 0;
}

(1)静态变量和普通变量的区别:静态变量在类中只是用static来声明,需要在类外进行定义;
(2)创建Person类的对象时会调用构造函数,构造函数会对cnt加一;
(3)销毁Person类对象时会调用析构函数,析构函数会对cnt减一;
上面代码的效果:用类的cnt静态变量来统计程序中还存放多少个Person类的对象;

3.2、代码结果分析

Person::cnt = 0
Person::cnt = 1
Person::cnt = 2
Person::cnt = 3
Person::cnt = 2
Person::cnt = 1
Person::cnt = 0

(1)每次创建Person类的对象都会调用对象自己的构造函数,从上面的程序执行结果可以得出结果,每个对象的构造函数操作的cnt都是同一份cnt;
(2)析构函数也是如此;
总结:对象操作的类静态成员都是同一份;

4、静态成员的使用注意事项

(1)静态成员变量/函数,需要在类外面进行定义;
(2)普通成员函数可以调用静态成员变量和函数;
(3)静态函数只能访问静态函数和静态变量,不能访问任何非静态的东西;
(4)在对象的构造函数中不能对静态变量进行初始化,因为静态变量不属于单个对象,不需要对象去初始化;

5、静态成员的本质

(1)从上面的例子可以看出,静态变量在类中用static声明,但是要在类外进行定义;普通的成员变量都是创建对象时自动创建的;
(2)静态成员的本质就是全局变量和全局函数,在类中用static声明,相当于把类和这个全局变量/函数进行绑定;
(3)因为静态成员是全局变量/函数,生命周期是整个程序的生命周期,所以我们不需要创建对象就可以使用静态成员;

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
静态成员是指在类中使用static关键字声明的成员。它们不依赖于类的实例化,而是与类本身相关联。静态成员具有以下几个特点: 1. 静态成员属于类,而不属于类的实例。这意味着无论创建多少个类的实例,静态成员只有一个副本,被所有实例共享。 2. 静态成员可以直接通过类名访问,而无需实例化类对象。例如,可以通过ClassName.staticMember的形式来访问静态成员。 3. 静态成员在类的初始化阶段被创建,并在整个程序的执行过程中存在。它们会在程序启动时进行初始化,直到程序结束时才会被销毁。 4. 静态成员可以访问类的非静态成员,但非静态成员无法直接访问静态成员。这是因为静态成员的存在不依赖于类的实例,而非静态成员的访问需要通过实例化类对象。 5. 静态成员可以用于共享数据或者统计类的实例个数等功能。例如,可以使用一个静态成员变量来记录类的实例数目。 需要注意的是,静态成员在内存中只有一份副本,如果对静态变量进行修改,那么这个修改会对所有实例产生影响。此外,静态成员还可以通过静态成员函数来访问和修改,这些静态成员函数也不依赖于类的实例。 总之,静态成员是与类相关联的成员,具有独特的访问方式和生命周期。它们在编写程序时具有一定的灵活性和实用性,可以用于共享数据和实现功能的统计等方面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

正在起飞的蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值