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

😁博客主页😁:🚀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 <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指针,故只能访问静态成员。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/712995.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文献学习——PWM - PFM模式无缝转换的PFC变换器统一控制

PWM - PFM模式无缝转换的PFC变换器统一控制 摘要&#xff1a;断续导通模式通常应用在升压功率因数校正转换器中。这篇文章提出了一种基于虚拟阻抗原理的实现脉冲宽度调制控制和脉冲频率调制控制的统一控制方法。控制模式可以简单的通过只调整一个控制参数来改变。因此&#xf…

现代信号处理14_基于蒙特卡洛的信号处理(CSDN_20240616)

Monte Carlo/Simulation方法 在统计上&#xff0c;样本数量是一个很重要的问题&#xff0c;在处理问题&#xff08;如计算样本均值&#xff09;的过程中&#xff0c;样本数量越多越好。但是在实际中&#xff0c;样本往往是稀缺的&#xff0c;获取数据就要付出代价。在贝叶斯理论…

GPTZero:引领AI内容检测

随着人工智能技术的飞速发展,AI生成内容(AIGC)正在迅速改变我们获取和消费信息的方式。然而,AIGC的激增也带来了一系列挑战,尤其是在内容真实性和版权方面。正是在这样的背景下,一家由00后团队创立的公司——GPTZero,以其独特的AI检测工具,迅速崛起为行业的领军者。 一…

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测

回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测 目录 回归预测 | Matlab实现GWO-ESN基于灰狼算法优化回声状态网络的多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-ESN基于灰狼算法优化回声状态…

Linux 文件的权限信息解读 chmod修改权限 数字序号表示权限

ls -l #列出当前文件 显示详细信息 drwxr-xr-x. 2 dpc test 6 Jun 15 07:45 test.txt共分为三部分 drwxr-xr-x.&#xff1a;表示文件和文件夹的权限信息dpc &#xff1a;文件&#xff0c;文件夹所属的用户test &#xff1a; 文件和文件夹所属的用户组 drwxr-xr-x 解读 d表示为…

Python自动化办公(一) —— 根据PDF文件批量创建Word文档

Python自动化办公&#xff08;一&#xff09; —— 根据PDF文件批量创建Word文档 在日常办公中&#xff0c;我们经常需要根据现有的PDF文件批量创建Word文档。手动操作不仅费时费力&#xff0c;而且容易出错。幸运的是&#xff0c;使用Python可以轻松实现这个过程。本文将介绍如…

RK3568平台(input篇)输入设备应用编程

一.输入设备介绍 输入设备其实就是能够产生输入事件的设备就称为输入设备&#xff0c;常见的输入设备包括鼠标、键盘、触摸屏、按钮等等&#xff0c;它们都能够产生输入事件&#xff0c;产生输入数据给计算机系统。 对于输入设备的应用编程其主要是获取输入设备上报的数据、输…

Postman使用教程(Postman详细图文教程)

本文讲解的是postman工具安装、postman安装教程、postman工具下载、postman使用教程。Postman使得得开发人员和测试人员能够更高效地与Web服务进行交互和调试。 Postman不仅支持常见的HTTP方法&#xff0c;如GET、POST、PUT、DELETE等&#xff0c;还提供了丰富的请求编辑功能&…

编译安装qemu-devel @FreeBSD

缘起 使用cbsd创建riscv jail的时候提示&#xff1a; you have no qemu-user, please install qemu-devle with BSD_USER and STATIC ops (emulators/qemu-devel) 使用pkg安装之后&#xff0c;创建的riscv jail启动报错&#xff1a; Starting jail: fbriscv, parallel timeo…

Qt QListView自定义树状导航控件

大部分的软件都有多个页面&#xff0c;这时候就需要一个导航栏控件&#xff0c;通过在导航栏中选择某一栏&#xff0c;同时显示对应的页面。 本文代码效果如下&#xff1a; 本文的导航栏控件基于大佬 feiyangqingyun 的导航栏控件博客Qt/C编写自定义控件46-树状导航栏_qt之实现…

计算机网络期末复习1(最后一天才开始学版)

1.一个PPP帧的数据部分&#xff08;用十六进制写出&#xff09;是7D 5E FE 27 7D 5D 7D 5D 65 7D 5E。试问真正的数据是&#xff08;用十六进制写出&#xff09; 由于PPP帧的标志字段为7E,因此,为了区别标志字段和信息字段,将信息字段中出现的每一个0x7E转变成(0x7D,0x5E),0x7…

LeetCode --- 401周赛

题目列表 3178. 找出 K 秒后拿着球的孩子 3179. K 秒后第 N 个元素的值 3180. 执行操作可获得的最大总奖励 I 3181. 执行操作可获得的最大总奖励 II 一、找出K秒后拿着球的孩子 这题可以直接模拟&#xff0c;从前往后&#xff0c;再从后往前走k次&#xff0c;最后直接返回…

【尚庭公寓SpringBoot + Vue 项目实战】公寓管理(十一)

【尚庭公寓SpringBoot Vue 项目实战】公寓管理&#xff08;十一&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】公寓管理&#xff08;十一&#xff09;1、业务介绍2、逻辑模型介绍3、接口开发3.1、保存或更新公寓信息3.2、根据条件分页查询详细信息3.3、根据ID获…

Carsim高级开发:VS Connect通讯开发指南

文章目录 前言一、VS Connect 概念引入二、VS Connect 通讯框架三、Carsim 工程配置1、车辆模型配置2、procedure配置3、Run Control配置4、受控车辆名称配置 四、VS Connect Server代码1、打开Sln工程2、代码修改 五、VS Connect Client代码1、函数的调用关系2、carsim_variab…

【JAVA开发笔记】实战演练,如何用EasyExcel导出表格,并且自定义合并单元格

目录 1. 前言 2. EasyExcel简介 3. EasyExcel简单导出案例讲解 3.1 EasyExcel依赖引入 3.2 测试类创建 3.3 Excel导出实现 4. EasyExcel合并单元案例讲解 4.1 实现自定义合并策略 4.2 使用自定义合并策略 5. 总结 1. 前言 项目上&#xff0c;需将一个列表数据导出Ex…

16. 第十六章 类和函数

16. 类和函数 现在我们已经知道如何创建新的类型, 下一步是编写接收用户定义的对象作为参数或者将其当作结果用户定义的函数. 本章我会展示函数式编程风格, 以及两个新的程序开发计划.本章的代码示例可以从↓下载. https://github.com/AllenDowney/ThinkPython2/blob/master/c…

(源码)供应商电子招投标管理系统实现方案和功能说明

采购在线招投标供应商管理系统是一个集成了多个关键功能的综合性系统&#xff0c;旨在优化采购流程、提高效率和确保透明度。以下是关于您提到的五个核心功能的详细解释&#xff1a; 供应商管理 此功能允许企业记录和管理供应商的基本信息&#xff0c;如公司名称、联系方式、主…

了解并解决 Flutter 中的灰屏问题

生产中的 flutter 应用程序中的灰屏是一种通用占位符&#xff0c;当框架遇到问题无法渲染预期用户界面时就会显示。是的&#xff0c;所以基本上是出现问题时的后备指示器。 有趣的是&#xff0c;这只出现在发布模式下。在任何其他模式下运行都会显示红色错误屏幕&#xff0c;并…

apt-get update和apt-get upgrade的区别

apt-get update apt-get update 命令用于更新本地软件包列表。具体来说&#xff0c;做了以下事情&#xff1a; ①从 /etc/apt/sources.list 文件和 /etc/apt/sources.list.d/ 目录下的所有文件中读取软件源配置。 ②连接到这些软件源&#xff0c;并下载最新的软件包列表。 ③将…

前端老古董execCommand——操作 选中文本 样式

文章目录 ⭐前言⭐exe command api用法&#x1f496; example示例&#x1f496; 测试效果 ⭐execommand和getSelection 的联系⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端老古董execCommand——操作选中文本。 execommand 当一个 HTML 文…