【C/C++】类成员进阶——类中静态成员static

news2024/11/25 15:25:02

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • 一、静态成员
  • 二、静态成员变量
    • 1.静态成员变量属于类
    • 2.静态成员变量一个类中只会存在一份
    • 3.静态成员变量存在与否和是否定义对象无关
    • 4.多个对象共享一份静态成员变量
    • 静态static成员属性
  • 三、静态成员函数
    • 1.静态成员函数的定义
    • 2.静态成员函数的使用
    • 3.静态成员函数没有this指针
    • 普通成员函数与静态成员函数的区别
  • 本文全部代码:

一、静态成员

静态成员需要使用static关键字进行修饰

【c语言】static静态变量详解

	static int a;
	static void fun(){}

二、静态成员变量

CTest类中定义静态成员变量:

#include <iostream>
using namespace std;
class CTest
{
public:
	int m_a;
	static int m_b;
	static long long m_c;
};

在构造函数中进行初始化:

CTest()
	{
		m_a = 1;
		m_b = 2;	//初始化?? 赋值
		m_c = 3;
	}

但是在主函数中使用静态成员变量m_bm_c时,出现报错:

在这里插入图片描述

此时的静态成员变量m_bm_c并未真正的被初始化,在构造函数中仅是为其赋值

静态成员变量需要在类外进行定义并且初始化

在这里插入图片描述

1.静态成员变量属于类

对一个空类只定义静态成员变量,再输出类和对象的字节大小

#include <iostream>
using namespace std;
class CTest
{
public:
	static int m_b;
	static long long m_c;
	CTest()
	{
		m_b = 2;	//初始化?? 赋值
		m_c = 3;
	}
};
//类外 定义以及初始化
int CTest::m_b = 2;
long long CTest::m_c = 3;
int main()
{
	CTest tst;
	cout << sizeof(tst) << "    " << sizeof(CTest) << endl;
	return 0;
}

在这里插入图片描述

输出结果都为1,仅为占位的大小

因此静态成员变量是属于类的,在编译期就存在

2.静态成员变量一个类中只会存在一份

创建第二个对象tst2再对类中成员进行取地址操作:

在这里插入图片描述

可以看出:

静态成员变量一个类中只会存在一份

3.静态成员变量存在与否和是否定义对象无关

不通过对象,通过类名作用域也可调用类中的静态成员变量:

在这里插入图片描述
因此静态成员变量存在与否和是否定义对象无关

4.多个对象共享一份静态成员变量

静态成员变量一个类中只会存在一份,对其中一个对象的静态变量值进行修改,另一个也会随之改变:

在这里插入图片描述

静态static成员属性

  • 属于类,编译期存在,一个类中只会存在一份,多个对象共享这一份静态成员

  • 存在与否和是否定义对象无关,在构造函数中不能对其初始化(赋值)

  • 静态成员属性需要在类外进行初始化,格式:类型 类名 类名作用域 ,给定初始值


三、静态成员函数

1.静态成员函数的定义

	//普通函数
	void fun(/*	CTest* const this */)
	{
		cout << /* this-> */m_a << "    " << m_b << endl;
	}
	//静态函数
	static void funstatic()
	{
		//...
	}

与静态成员变量相同,静态成员函数也 属于类,编译期存在,一个类中只会存在一份,多个对象共享这一份静态成员函数

2.静态成员函数的使用

在静态成员函数中调用非静态变量m_a和静态变量m_b

	static void funstatic()
	{
		cout << m_a << "    " << m_b << endl;
		cout << m_a << "    " << CTest::m_b << endl;
	}

其中,m_a不允许被使用:

而静态成员变量m_b却可以正常使用
在这里插入图片描述

这是因为 静态成员函数只能访问静态的成员,使用不了普通成员

	static void funstatic2()
	{
		//fun();		//error
		funstatic();	//ok
	}

同样也访问不了普通成员函数,只能使用静态成员函数

在主函数中使用时,可以通过对象调用

与静态成员变量相同,也可以不通过对象调用,使用类名作用域直接使用:

	CTest tst;
	tst.fun();

	CTest::funstatic2();
	tst.funstatic();

3.静态成员函数没有this指针

this指针是指向调用该成员函数的类对象的指针

CTest* const this

静态成员函数不依赖于任何类的对象,而是和类本身相关,因此没有this指针

普通成员函数与静态成员函数的区别

  • 静态成员函数 没有隐藏的this指针

  • 在静态的成员函数中,只能使用静态的成员,在普通成员函数中都能使用

  • 静态成员函数可以不通过对象调用,普通函数必须通过对象调用

  • 使用:

    1.通过对象

    2.类名作用域直接使用


本文全部代码:

#include <iostream>
using namespace std;
class CTest
{
public:
	int m_a;
	static int m_b;
	static long long m_c;
	CTest()
	{
		m_a = 1;
		m_b = 2;	//初始化?? 赋值
		m_c = 3;
	}
	void fun(/*	CTest* const this */)
	{
		cout << /* this-> */m_a << "    " << m_b << endl;
	}

	//静态函数
	static void funstatic()
	{
		/*cout << m_a << "    " << m_b << endl;
		cout << m_a << "    " << CTest::m_b << endl;*/
	}
	static void funstatic2()
	{
		//fun();		//error
		funstatic();	//ok
	}
};
//类外 定义以及初始化
int CTest::m_b = 2;
long long CTest::m_c = 3;

int main()
{

	CTest tst;

	cout << tst.m_a <<"  " << tst.m_b <<"  " << tst.m_c << endl;
	cout << sizeof(tst) << "    " << sizeof(CTest) << endl;
	CTest tst2;
	cout << &tst.m_a << "    " << &tst2.m_a << endl;
	cout << &tst.m_b << "    " << &tst2.m_b << endl;

	
	//---------不通过对象---------
	cout << CTest::m_c << endl;

	//------共享-------
	tst.m_b = 20;
	cout << tst2.m_b << endl;

	
	tst.fun();

	CTest::funstatic2();
	tst.funstatic();

	return 0;
}

在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

暑假第十一天打卡

离散&#xff1a; 今天主要学的是推理&#xff0c;感觉推理定理那一大堆公式就是假设箭头前是true&#xff0c;然后将双箭头改为单箭头&#xff0c;然后由此得到对应推理规则&#xff0c;横线上是“因为”&#xff0c;横线下是所以 推理的形式结构: (p → q) ∧ q → p 科研 …

Java编译运行程序(Windows环境)

1.运行条件&#xff1a;我们已经配好环境变量&#xff0c;且在需要编译的文件的目录下打开cmd&#xff1b;还没配好环境变量的同学可以参考&#xff08;链接最上面的推荐文章链接&#xff09;&#xff1a;http://t.csdn.cn/HPWWr 2.首先需编译目标编译的Java文件&#xff0c;…

【Linux】udp服务器实现英汉互译以及远程操作

全是好玩的小功能~ 文章目录 前言一、udp服务器实现网络在线英汉互译二、udp服务器实现网络远程操作总结 前言 在上一篇文章中我们详细的讲解了udp服务器的实现步骤&#xff0c;把用到的每一个接口都进行了详细的讲解&#xff0c;而我们在上一篇只是简单的网络通信功能&#x…

Spring中必备的自定义扩展点,结合工作中的案例,你一定用得到

文章目录 简单介绍Spring流程从问题入手介绍扩展点如何在static方法中从Spring容器中获取bean对象如何在bean实例化前后做一些自定义操作如何移除&#xff0c;修改一些BeanDefination怎样用相同的线程从Spring容器中获取同一个bean对象如何在Spring容器初始化或销毁时做一些自定…

2023年软件测试方向大厂招人和面试要求趋势

当前软件测试的行业现状是什么&#xff1f;2022年后半年经常能够在知乎、小红书、抖音等互联网平台上看到有人在抱怨软件测试行业就业困难。抱怨的一个主要内容是相比2021年测试岗位数下跌&#xff0c;几个月都找不到工作。另外一个测试岗位是有限的&#xff0c;但是应聘者在变…

Python读取excle文件,插入到数据库

一、需求背景 最近项目实践过程中遇到了一个问题&#xff1a;在使用Navicat将数据导入到PostgreSQL数据库时&#xff0c;发现时间格式的字段中的时间数值发生了变化&#xff0c;导致部分数据的时间不正确&#xff0c;故数据手动导入数据库报错。为了解决这个问题&#xff0c;决…

集群基础6——keepalived+lvs+apache

文章目录 一、环境说明二、安装apache三、配置keepalivedlvs3.1 配置lvs规则3.2 配置keepalived规则&#xff08;主&#xff09;3.3 配置keepalived规则&#xff08;备&#xff09; 四、验证 一、环境说明 先对两台后端服务器的httpd服务进行负载均衡&#xff0c;再对负载均衡服…

如何二次封装一个el-table组件并二次复用

*注:示例使用的是vue3和element进行二次封装的 首先我们来看效果图&#xff08;总共可以分为以下几个模块&#xff09;&#xff1a; 表格数据操作按钮区域表格信息提示区域表格主体内容展示区域表格分页区域 表单搜索没有封装在这里是为了降低代码的耦合性(有兴趣的可以查看我…

ChatGPT开发【一】:打造与ChatGPT默契互动的绝佳输入格式

点击加入->【OpenAI-API开发】技术交流群 文章目录 1. 导入openai库2.示例聊天API调用3.GPT-3.5-Turbo-0301的使用技巧系统消息Few-show prompt 4.计数Token数 Chatgpt由Openai最先进的型号 gpt-3.5-Turbo和 gpt-4提供支持。我们可以使用OpenAI API使用 GPT-3.5-Turbo或…

谈谈在Bitcask中用读写锁实现并发控制的性能表现

背景 最近被问了几次nutsdb事务是怎么实现的&#xff0c;也就是并发控制是怎么做的。我说&#xff0c;用一把大的读写锁&#xff0c;写事务拿到写锁&#xff0c;读事务拿读锁&#xff0c;这样子做的。提问者先是震惊&#xff0c;接着说是有一点鄙夷&#xff0c;我感觉大概心里…

【踩坑指南】Django+channels WebSocket配置

目前我搜到网上所有配置Djangochannels的教程/博客中&#xff0c;都没有提及这一点。希望能帮助你 踩的坑必须写在最前面&#xff1a; 根据文档的步骤去配置&#xff0c;每次到执行python manage.py 的时,使用的是默认的development server&#xff0c;而不是我们想要的Star…

解决:.prettierrc 配置完后,自动保存并没有格式化代码

如果你也碰到了同样的问题&#xff0c;请先确保&#xff1a; .prettierrc 文件已正确配置&#xff0c;例如我的&#xff1a; {"semi": false,"singleQuote": true,"arrowParens": "always","trailingComma": "all&qu…

卷积神经网络参数量和计算量的计算方法

本文总结了标准卷积、分组卷积和全连接层参数量和计算量的计算方法&#xff0c;如有错误&#xff0c;麻烦大家指正 一、标准卷积 假设输入特征的shape为[, , ]&#xff0c;卷积核的shape为[, , , ]&#xff0c;输出特征的shape为[, , ]&#xff0c;则&#xff0c; 标准卷积运…

C++特殊类设计及类型转换

目录 一、特殊类的设计 1.不能被拷贝的类 2.只能在堆区构建对象的类 3.只能在栈区构建对象的类 4.不能被继承的类 二、单例模式 1.饿汉模式 2.懒汉模式 3.线程安全 4.单例的释放 三、C类型转换 1.C语言的类型转换 2.static_cast 3.reinterpret_cast 4.const_cas…

Python补充笔记1-字符串

目录 1.字符串的驻留机制​编辑 2.字符串查找 2.1字符串查询操作方法 3.字符串大小写转换 3.1字符串的大小写转换方法 4.字符串内容对齐 4.1字符串内容对齐操作方法 5.字符串的劈分 5.1字符串劈分操作的方法​编辑 6.字符串判断 6.1判断字符串操作的方法​编辑 6.2字符串替换和…

虚拟化技术及实时虚拟化概述

版权声明&#xff1a;本文为本文为博主原创文章&#xff0c;未经本人同意&#xff0c;禁止转载。如有问题&#xff0c;欢迎指正。博客地址&#xff1a;https://www.cnblogs.com/wsg1100/ 实时虚拟化技术是一种针对实时应用场景的虚拟化技术&#xff0c;它要求在保证虚拟化优势…

STM32 ws2812b 最快点灯cubemx

文章目录 前言一、cubemx配置二、代码1.ws2812b.c/ws2812b.h2.主函数 前言 吐槽 想用stm32控制一下ws2812b的灯珠&#xff0c;结果发下没有一个好用的。 emmm&#xff01;&#xff01;&#xff01; 自己来吧&#xff01;&#xff01;&#xff01;&#xff01; 本篇基本不讲原理…

6、传输层TCP28

TCP协议&#xff1a;传输控制协议 1、协议实现 16位源端端口&16位对端端口&#xff1a;描述通信俩端进程32位序号&#xff1a;告诉接收端&#xff0c;这条数据在整体数据中的排序&#xff0c;接收端根据序号进行排序32位确认序号&#xff1a;向发送端进行回复确定&#xff…

pytest-html报告修改与汉化

目录 前言 生成报告 测试代码 原始报告 修改Environment 修改后的效果 修改Summary 修改后的效果 修改Results 优化Test 解决中文乱码 删除多余部分 修改后的效果 删除Links 修改后的效果 增加失败截图与用例描述 完整的conftest.py代码 汉化报告 修改plugin…

ClickHouse进阶

一、Explain查看执行计划 在 clickhouse 20.6 版本之前要查看 SQL 语句的执行计划需要设置日志级别为 trace 才能可以看到&#xff0c;并且只能真正执行 sql&#xff0c;在执行日志里面查看。 在 20.6 版本引入了原生的执行计划的语法。在 20.6.3 版本成为正式版本的功能。 …