C++学习日记---第16天
笔记复习
1.C++对象模型
在C++中,类内的成员变量和成员函数分开存储
我们知道,C++中的成员变量和成员函数均可分为两种,一种是普通的,一种是静态的,对于静态成员变量和静态成员函数,我们知道他们不属于类的对象,事实上,非静态成员函数也即普通的成员函数也不属于类的对象。只有非静态成员变量也即普通的成员变量才属于类的对象。
下面是代码示例的完整代码:
#include<iostream>
using namespace std;class person {int m_A;static int m_B;void func() {}static void func1() {}
};void test01() {person p;cout << "size of p=" << sizeof(p) << endl;
}void test02() {person p;cout << "size of p=" << sizeof(p) << endl;
}int main() {test01();test02();system("pause");return 0;
}
在C++中,空对象的内存空间为一个字节,这是由C++编译器分配的,目的是为了区分空对象占内存的位置,这样每个对象都会有独一无二的内存地址,当我们删除person类中的代码运行程序后将会输出两个1
#include<iostream>
using namespace std;class person {
};void test01() {person p;cout << "size of p=" << sizeof(p) << endl;
}void test02() {person p;cout << "size of p=" << sizeof(p) << endl;
}int main() {test01();test02();system("pause");return 0;
}

前面我们讲到只有成员变量才属于C++的对象,因此我们在空类的基础上写入成员函数,静态成员变量,静态成员函数,这个类的对象也依旧是空对象
#include<iostream>
using namespace std;class person {static int m_B;void func() {
}static void func1() {}
};void test01() {person p;cout << "size of p=" << sizeof(p) << endl;
}void test02() {person p;cout << "size of p=" << sizeof(p) << endl;
}int main() {test01();test02();system("pause");return 0;
}

2.this指针
我们知道,当我们创建并调用类的对象时,这些对象会共用类中的成员函数,那么这些函数如何区分时哪个对象调用自己呢?这时候就有了this指针,C++通过提供this指针来解决该问题,。
this指针是一种特殊的指针,this指针指向被调用成员函数的所属的对象(this指向整个对象,而不只是对象里面的成员)。在非静态成员函数内部,你可以使用 this 指针访问调用对象的成员。this 实际上是当前类类型的指针,例如,对于类Kunkun的成员函数,this 是 Kunkun 类型的指针。
作用:
1)解决变量命名冲突
2)在类的非静态成员函数中返回对象本身,可使用return*this
(this指针还有更多用途,但过于复杂,这里不再介绍)
1)解决变量命名冲突
#include<iostream>
using namespace std;class person {
public:person(int age) {age = age;}int age;
};void test01() {person p1(18);p1.age = 18;
}int main() {test01();return 0;
}
在这份代码种,person有参函数中的age是赋值给形参,即形参赋值给形参,并没有将接收到的形参的值赋值给成员变量,因此成员变量未初始化,当我们运行这个代码的时候就会出现成员变量未初始化的问题,这时候我们需要使用this指针
#include<iostream>
using namespace std;class person {
public:person(int age) {this->age = age;}int age;
};void test01() {person p1(18);p1.age = 18;
}int main() {test01();return 0;
}
这里this指针指向被调用函数(person有参函数)所属对象(p1)的成员变量age,这样就把age区分开了,不过在实际的编程中我们会规范化命名尽量避免这种情况出现。
2)在类的非静态成员函数中返回对象本身,可使用return*this
#include<iostream>
using namespace std;class person {
public:person(int age) {this->age = age;}person& personaddage(person &p) {this->age += p.age;//将自身的年龄加上传入对象的年龄return *this;//this返回的是person类型的对象,因此函数要设置为person类型,&允许函数返回一个对象的引用而不是一个新的对象,返回对象的引用允许多个函数连续调用操作同一个对象}int age;
};void test02() {person p1(10);person p2(10);//链式调用:p2.personaddage(p1).personaddage(p1).personaddage(p1);//p2是对象,因此p2.personaddage(p1)语法正确,而如果没有return *this;//那么返回的数据类型就是int类型,int.personaddage(p1)不成立,因此需要返回对象cout << p2.age << endl;
}int main() {test02();return 0;
}
细心的小伙伴可以发现,this指针指向一个值的时候我们修改了这个值,那么this指针能否修改指针的指向呢?答案是不能,因此this指针实际上是指针常量(指针指向的值可以改变,但指针的指向无法改变)
3.空指针访问成员函数
C++中空指针也可以访问成员函数
-
若成员函数中未使用到成员变量,可使用空指针调用该成员函数;
-
若成员函数中使用了成员变量,须对this进行判空操作,以防止程序崩溃。
对于第2点,也即C++无法用空指针来调用成员函数的成员变量
#include<iostream>
using namespace std;class person {
public:void showclassname() {cout << "this is person class" << endl;}void showpersonage() {if (this == NULL) {//没有判空操作时程序会报错return;}cout << "age=" << this->m_age << endl;//this指针指向p,p是一个空指针,是无法访问属性的}int m_age;
};void test01() {person* p = NULL;p->showclassname();p->showpersonage();
}int main() {test01();system("pause");return 0;
}
相关文章:
C++学习日记---第16天
笔记复习 1.C对象模型 在C中,类内的成员变量和成员函数分开存储 我们知道,C中的成员变量和成员函数均可分为两种,一种是普通的,一种是静态的,对于静态成员变量和静态成员函数,我们知道他们不属于类的对象…...
SOA、分布式、微服务之间的关系和区别?
在当今的软件开发领域,SOA(面向服务架构)、分布式系统和微服务是三个重要的概念。它们各自有着独特的特性和应用场景,同时也存在着密切的关系。以下是关于这三者之间关系和区别的详细分析: 关系 分布式架构的范畴&…...
java基础概念46-数据结构1
一、引入 List集合的三种实现类使用了不同的数据结构! 二、数据结构的定义 三、常见的数据结构 3-1、栈 特点:先进后出,后进先出。 java内存容器: 3-2、队列 特点:先进先出、后进后出。 栈VS队列-小结 3-3、数组 3-…...
Node.js-Mongodb数据库
MongoDB MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库 数据库是什么? 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序(软件) 数据库作用? 对数据进行增、删…...
STM32 ADC --- 知识点总结
STM32 ADC — 知识点总结 文章目录 STM32 ADC --- 知识点总结cubeMX中配置注解单次转换模式、连续转换模式、扫描模式单通道采样的情况单次转换模式:连续转换模式: 多通道采样的情况禁止扫描模式(单次转换模式或连续转换模式)单次…...
技术创新与人才培养并重 软通动力子公司鸿湖万联亮相OpenHarmony人才生态大会
11月27日,由开放原子开源基金会指导,OpenHarmony项目群工作委员会主办的OpenHarmony人才生态大会2024在武汉隆重举办。软通动力子公司鸿湖万联作为OpenHarmony项目群A类捐赠人应邀出席。大会期间,鸿湖万联不仅深度参与了OpenHarmony人才生态年…...
兔子繁衍问题
7-2 兔子繁衍问题 分数 15 全屏浏览 切换布局 作者 徐镜春 单位 浙江大学 一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔…...
汉代风云人物 1晁错
晁错曾是汉景帝的老师。汉景帝登基后,晁错提出削藩建议,这一举措遭到诸多藩国诸侯的强烈反对,由此引发了紧张局势。 袁盎此前曾担任吴国的宰相,晁错觉得袁盎与吴国等藩国关系密切,很可能知晓藩王们谋反的相关情况却没…...
学习threejs,使用specularMap设置高光贴图
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.MeshPhongMaterial高…...
【UE5 C++】判断两点连线是否穿过球体
目录 前言 方法一 原理 代码 测试 结果 方法二 原理 一、检查连线与球体的相交情况 二、检查距离与球体半径的关系 三、检查连线与球体的相交 代码 前言 通过数学原理判断空间中任意两点的连线是否穿过球体,再通过射线检测检验算法的正确性。 方法一 …...
【Blender】如何创建空心管道
步骤 1:创建一个圆柱体 添加圆柱体: 在 Object Mode 下按 Shift A > Mesh > Cylinder。 步骤 2:制作空心效果 进入编辑模式: 选中圆柱体,按 Tab 进入 Edit Mode。 删除顶部和底部面: 按 3 进入面选…...
ChromeBook11 HP G7EE 刷入Ubuntu的记录
设置开发模式-> 拆电池(解锁)-> 刷入bios ->使用u盘刷入系统。 下面是详细过程,除了拆机有点紧,没有难度(我不负责~ 其实我试了好几次其他系统的,先进了pe,pe没问题(音频x),有一个win10的u盘(几个…...
16asm - 汇编介绍 和 debug使用
文章目录 前言硬件运行机制微机系统硬件组成计算机系统组成8086cpu组织架构dosbox安装配置debug debug使用R命令D命令E命令U命令T命令A命令标志寄存器 总结 前言 各位师傅大家好,我是qmx_07,今天给大家讲解 十六位汇编 和 debug调试器的使用 硬件运行…...
初识QT第一天
思维导图 利用Qt尝试做出原神登陆界面 import sys from PyQt6.QtGui import QIcon, QPixmap, QMovie from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QLineEdit# 封装原神窗口类 class Genshin(QWidget):# 构造函数def __init__(self):# 初始化父类…...
ChatGPT科研应用、论文写作、课题申报、数据分析与AI绘图
随着人工智能技术的飞速发展,ChatGPT等先进语言模型正深刻改变着科研工作的面貌。从科研灵感的激发、论文的高效撰写,到课题的成功申报,乃至复杂数据的深度分析与可视化呈现,AI技术均展现出前所未有的潜力。其实众多科研前沿工作者…...
原子类、AtomicLong、AtomicReference、AtomicIntegerFieldUpdater、LongAdder
原子类 JDK提供的原子类,即Atomic*类有很多,大体可做如下分类: 形式类别举例Atomic*基本类型原子类AtomicInteger、AtomicLong、AtomicBooleanAtomic*Array数组类型原子类AtomicIntegerArray、AtomicLongArray、AtomicReferenceArrayAtomic…...
c语言——数组名该如何理解呢?
一般情况下,数组名表示首元素地址,以下2种除外: ①、sizeof(数组名) 表示整个数组 ※只有数组名的情况 sizeof(数组名i) 就不能表示整个数组 ②、&数组名 表示整个数组,取的是整个数…...
Linux学习笔记13 系统进程管理
前文 Linux学习笔记10 系统启动初始化,服务和进程管理(上)-CSDN博客 Linux学习笔记11 系统启动初始化,服务和进程管理(下)-CSDN博客 Linux学习笔记12 systemd的其他命令-CSDN博客 之前学习了怎么使用sy…...
Spring Boot 项目集成camunda流程引擎
Spring Boot 项目集成camunda流程引擎 camunda地址 camunda中文地址 使用camunda开源工作流引擎有:通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式。 文本重点介绍如何在Spring Boot应用程序中如何集成Camunda Platform开…...
2024.12.2工作复盘
1.今天学了什么? 简单的写了一篇博客,是关于参数校验的问题,参数校验,一个是前后端校验到底一不一致,一个是绕过前端校验,看后台的逻辑到底能不能校验住。 2.今天解决了什么问题? 3.今天完成…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
