当前位置: 首页 > news >正文

c++基础(八)——静态成员

一、静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员分为:

静态成员变量:
(1)所有对象共享同一份数据:
作为静态成员变量,所储存的变量只有一份,当A对象改变这一数值之后,B对象读取这个数值时即为A对象更改之后的数值。

void test4()
{
	person p1;
	cout << "person的年龄是" << p1.m_age << endl;
	person p2;
	p2.m_age = 200;
	cout << "person的年龄是" << p1.m_age << endl;
}

此时输出为:

person的年龄是100
person的年龄是200

(2)在编译阶段分配内存:
代码没有运行之前就已经在全局区给这一成员变量分配了一块内存地址。
(3)类内声明,类外初始化

class person
{
public:
	//类内声明
	static int m_age;
};

//类外初始化,由于类外为一个全局变量,需要注明是peron这一作用域下的一个变量
int person::m_age = 100;

静态成员变量不属于某个对象上,所有对象都共享同一份数据。静态成员有如下两种访问形式:

void test5()
{
	//1、通过对象进行访问
	person p1;
	cout << "person的年龄是" << p1.m_age << endl;
	
	//2、通过类名进行访问
	cout << person::m_age << endl;

}

静态成员也是有访问权限的,当一个私有变量为静态变量时,只有类内可以访问该变量,类外是没有权限访问的。样例如下。此时会报错严重性E0265 成员 “person::m_Age” (已声明 所在行数:20) 不可访问。

class person
{

private:
	static int m_Age;
};
int person::m_Age = 100;
cout << person::m_Age << endl;

静态成员函数:
(1)、所有对象共享同一函数
静态成员函数不属于某个对象上,所有对象都共享同一份数据。静态函数有如下两种访问形式:

void test6()
{
	person p1;
	//通过对象访问
	p1.func();

	//通过类名访问
	person::func();

}

(2)、静态成员函数只能访问静态成员变量
非静态成员变量必须通过一个对象才能读和写本块内存,如果对其操作,则无法确定需要对哪个对象下的该变量进行操作。
又因为静态成员函数不属于某个对象上,所有对象都共享同一份数据,不区分所属关系。所以可以对其变量进行操作。

class person
{
public:

	//静态成员函数
	static void func()
	{
		m_a = 100;
		m_b = 200; //此行会报错:非静态成员引用必须与特定对象相对
		cout << "静态函数成员调用" << endl;
	}
	static int m_a;
	int m_b;
};
int person::m_a = 1;

同时,静态函数也是有访问权限的,当一个私有变函数为静态函数时,只有类内可以访问该函数,类外是没有权限访问。

相关文章:

  • 【手把手带你学JavaSE系列】练习项目—图书管理系统
  • iptables实战
  • JavaScript心得笔记-1(后端了解必备)
  • 前端培训丁鹿学堂:css布局之定位知识总结
  • 基础 | 并发编程 - [AQS]
  • java8 新特性 stream
  • DAY45(DAY46拓展):SOCKS 代理技术
  • Handler消息传递机制
  • Django之路由匹配
  • Java面试(四)JVM基础
  • 新学期,新FLAG
  • 一文详解C语言文件
  • Java实现的一个编译器源代码(Win11)
  • 内核调试:crash工具与vmcore实践
  • C++ Qt / VS2019 +opencv + onnxruntime 部署语义分割模型【经验】
  • php的引用
  • Android组件 - 收藏集 - 掘金
  • angular组件开发
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • ES6 学习笔记(一)let,const和解构赋值
  • Java IO学习笔记一
  • Java多线程(4):使用线程池执行定时任务
  • Java基本数据类型之Number
  • Linux快速复制或删除大量小文件
  • magento2项目上线注意事项
  • OSS Web直传 (文件图片)
  • php ci框架整合银盛支付
  • 记一次用 NodeJs 实现模拟登录的思路
  • 巧用 TypeScript (一)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 微信公众号开发小记——5.python微信红包
  • 数据库巡检项
  • #在 README.md 中生成项目目录结构
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (0)Nginx 功能特性
  • (20050108)又读《平凡的世界》
  • (5)STL算法之复制
  • (C++17) std算法之执行策略 execution
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (独孤九剑)--文件系统
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (转)关于pipe()的详细解析
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net framework profiles /.net framework 配置
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .NET导入Excel数据
  • .net开发引用程序集提示没有强名称的解决办法
  • .stream().map与.stream().flatMap的使用
  • :“Failed to access IIS metabase”解决方法
  • @Autowired和@Resource的区别
  • [AIGC] Spring Interceptor 拦截器详解
  • [Android]通过PhoneLookup读取所有电话号码
  • [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存
  • [BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)
  • [C#]科学计数法(scientific notation)显示为正常数字