【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
⏰发布时间⏰:2024-06-16 00:05:01

本文未经允许,不得转发!!!



在这里插入图片描述

🎄一、概述

在C++编程中,有时需要定义一些成员是属于整个类的,而不是属于某个对象。例如:定义一个数据成员来记录这个类创建了多少个对象。

C++的静态(static)成员就是属于整个类而非属于某个对象的。本文介绍下面几个内容:
1、什么是C++的静态数据成员、静态成员函数?
2、静态数据成员、静态成员函数分别由什么特点?
3、怎么声明、定义静态数据成员、静态成员函数?
4、怎么使用 静态数据成员、静态成员函数?


在这里插入图片描述

🎄二、静态(static)数据成员

静态(static)数据成员:是指在类中声明时使用关键字static修饰的数据成员。 静态数据成员可以是 public 的或 private 的。本质上就是一个全局变量,只不过受 类名作用域权限 控制。

怎样声明、定义静态数据成员?
在类中声明时使用static关键字修饰,一般在类外定义并初始化,类外定义时不需要加static。参考下面代码:

class CDate
{
public:
	static int s_ObjCount;	// 静态数据成员声明
	...
private:
	static int s_ObjCount2;
	...
};
// 静态数据成员定义
int CDate::s_ObjCount = 0;
int CDate::s_ObjCount2= 0;

静态数据成员的几个特点

  • 1、静态数据成员属于整个类,而不属于某个对象,所有对象共享静态数据成员;
  • 2、静态数据成员一般在类内声明、在类外定义,声明时加static修饰,定义时不加static
  • 3、静态数据成员定义后位于程序的全局数据区,并一直存在于程序的整个生命周期中;
  • 4、静态数据成员可以是 public 的或 private 的
    • public 的静态数据成员可以使用类名作用域直接访问,private 的静态数据成员只能在类内访问;
    • public 的静态数据成员可以使用类的对象、引用或者指针来访问;
    • 成员函数可以直接使用静态数据成员,而不需要作用域运算符;
  • 5、静态数据成员的类型可以就是它所属的类类型。 而非静态数据成员只能声明成它所属类的指针或引用。

下面通过代码来理解这些特点:

// g++ 17_static_member_data.cpp 
#include <iostream>
using namespace std;

class CDate
{
public:
	CDate(int year, int mon, int day)
	{
		m_year = year;
		m_mon = mon;
		m_day = day;
		
		// 成员函数可以直接使用静态数据成员,而不需要作用域运算符
		s_ObjCount++;
		s_ObjCountPrv++;
	}
public:
	static int s_ObjCount;		// 类内声明静态数据成员
private:
	static int s_ObjCountPrv;	// 类内声明静态数据成员
	static CDate s_Date;		// 静态数据成员可以用所属类类型
	//CDate date;		//报错:field ‘date’ has incomplete type
	CDate *pDate;	// 非静态数据成员,只能声明成所属类的指针或引用
	int m_year;
	int m_mon;
	int m_day;

};

static int gCount = 0;

// 类外定义静态数据成员
int CDate::s_ObjCount = 0;
int CDate::s_ObjCountPrv= 0;


int main()
{
	CDate::s_ObjCount = 0;		// public静态数据成员,使用类名作用域直接访问
	//CDate::s_ObjCountPrv = 0;	// 报错:private静态数据成员只能在类内访问
	
	CDate date(2024,06,14);
	date.s_ObjCount = 0;	// public静态数据成员,可以使用类的对象访问
	
	CDate rDate = date;	
	rDate.s_ObjCount = 1;	// public静态数据成员,可以使用类的引用访问
	
	CDate *pDate = &date;
	pDate->s_ObjCount = 1;	// public静态数据成员,可以使用类的指针访问
	
	cout << "gCount=" << &gCount << ", s_ObjCount=" << &CDate::s_ObjCount <<endl; // 打印地址可以看到都是在同一区域

	return 0;
}

在这里插入图片描述

🎄三、静态(static)成员函数

静态(static)成员函数:是指在类中声明时使用关键字static修饰的成员函数。静态(static)成员函数可以是 public 的或 private 的。

静态成员函数不包含this指针,所以也不能直接访问非静态成员。

怎样声明、定义静态成员函数?
在类中声明成员函数时使用static关键字修饰,如果该函数在类外定义则不需要加static。参考下面代码:

class CDate
{
public:
	static int getObjCount();	// 类内声明静态成员函数
	...
private:
	static int getObjCountPrv()	// 类内声明并定义静态成员函数
	{
		return s_ObjCountPrv;
	}
	...
};
// 类外定义静态成员函数,省略static
int CDate::getObjCount()
{
	return s_ObjCount;
}

静态成员函数的几个特点

  • 1、静态成员函数属于整个类,而不属于某个对象,所有对象共享静态成员函数;
  • 2、静态成员函数在声明时加static,类外定义时不加static
  • 3、静态成员函数没有this指针,只能访问静态成员,不能访问非静态成员;
  • 4、静态成员函数可以是 public 的或 private 的
    • public 的静态成员函数可以使用类名作用域直接访问,private 的静态成员函数只能在类内访问;
    • public 的静态成员函数可以使用类的对象、引用或者指针来访问;
    • 成员函数可以直接使用静态成员函数,而不需要作用域运算符;

下面修改一下上个小节的代码,演示静态成员函数的几个特点:

// g++ 17_static_member_fun.cpp 
#include <iostream>
using namespace std;

class CDate
{
public:
	CDate(int year, int mon, int day)
	{
		m_year = year;
		m_mon = mon;
		m_day = day;
		
		// 成员函数可以直接使用静态数据成员,而不需要作用域运算符
		s_ObjCount++;
		s_ObjCountPrv++;
	}
public:
	static int s_ObjCount;		// 类内声明静态数据成员
	static int getObjCount();	// 类内声明静态成员函数
private:
	static int s_ObjCountPrv;	// 类内声明静态数据成员
	static CDate s_Date;		// 静态数据成员可以用所属类类型
	//CDate date;		//报错:field ‘date’ has incomplete type
	CDate *pDate;	// 非静态数据成员,只能声明成所属类的指针或引用
	int m_year;
	int m_mon;
	int m_day;
	
	static int getObjCountPrv()	// 类内声明并定义静态成员函数
	{
		return s_ObjCountPrv;
	}
};

static int gCount = 0;

// 类外定义静态数据成员
int CDate::s_ObjCount = 0;
int CDate::s_ObjCountPrv= 0;

// 类外定义静态成员函数,省略static
int CDate::getObjCount()
{
	// cout << m_year << endl; // 错误,静态成员函数没有`this`指针,只能访问静态成员,不能访问非静态成员;
	return s_ObjCount;
}

int main()
{
	CDate::getObjCount();	// public静态成员函数,使用类名作用域直接访问
//	Date::getObjCountPrv();	// 报错:private静态成员函数只能在类内访问
	
	CDate date(2024,06,14);
	date.getObjCount();		// public静态成员函数,可以使用类的对象访问
	
	CDate rDate = date;	
	rDate.getObjCount();	// public静态成员函数,可以使用类的引用访问
	
	CDate *pDate = &date;
	pDate->getObjCount();	// public静态成员函数,可以使用类的指针访问

	return 0;
}

在这里插入图片描述

🎄四、总结

👉本文介绍类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码。

类的静态成员是属于整个类的,与对象没有关联。
静态成员在声明时加static,定义时不加static。
公有的静态成员可以直接使用类名作用域访问,或类的对象、指针、引用去访问,私有的只在类内访问。
静态成员函数没有this指针,故只能访问静态成员。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wkd_007

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

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

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

打赏作者

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

抵扣说明:

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

余额充值