【C++ | 静态成员】类的 静态(static)数据成员、静态(static)成员函数 详解及例子代码
创始人
2025-01-16 15:09:58
0次

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

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

目录

  • 🎄一、概述
  • 🎄二、静态(static)数据成员
  • 🎄三、静态(static)成员函数
  • 🎄四、总结



在这里插入图片描述

🎄一、概述

在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  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 <

在这里插入图片描述

🎄三、静态(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  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指针,故只能访问静态成员。

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

相关内容

热门资讯

科技分享开挂!友友联盟辅助透视... 您好,友友联盟这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩家在这款...
做出回应透视挂!小小辅助透视挂... 做出回应透视挂!小小辅助透视挂,攒劲甘肃麻将是真的有外挂,好像有挂方略小小透视方法中分为三种模型:小...
盘点一款透视挂!禾城麻将辅助透... 盘点一款透视挂!禾城麻将辅助透视挂,星乐麻将是真的有外挂,一直有挂技术1、首先打开禾城麻将辅助器下载...
据文件显示辅助!玖乐游戏辅助透... 据文件显示辅助!玖乐游戏辅助透视挂,奕趣存在有外挂,总是有人有挂1、全新机制【玖乐游戏ai辅助工具激...
揭秘开挂!赫麒众游辅助透视挂,... 揭秘开挂!赫麒众游辅助透视挂,嘻游联盟真的是有外挂,好像揭秘有挂1、下载好赫麒众游脚本下载之后点击打...
一分钟揭秘开挂!闲乐辅助透视挂... 您好,闲乐这款游戏可以开挂的,确实是有挂的,需要了解加去威信【136704302】很多玩家在这款游戏...
推荐十款开挂!三哥玩辅助透视挂... 推荐十款开挂!三哥玩辅助透视挂,陕西丫丫麻将是有外挂,其实有挂技巧1、下载好三哥玩正确养号方法之后点...
实测教程开挂!叮叮娱乐辅助透视... 实测教程开挂!叮叮娱乐辅助透视挂,牌缘南通长牌真的是有外挂,果然了解有挂1、牌缘南通长牌辅助软件下载...
做出回应开挂!天和娱乐辅助透视... 做出回应开挂!天和娱乐辅助透视挂,新天涯确实有外挂,其实确实有挂亲,关键说明,天和娱乐透视脚本安卓赛...
玩家必备教程辅助!逗娱碰胡辅助... 玩家必备教程辅助!逗娱碰胡辅助透视挂,多米贵阳麻将真的是有外挂,真是有挂教程逗娱碰胡破解侠是真的助透...