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

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++中空指针也可以访问成员函数

  1. 若成员函数中未使用到成员变量,可使用空指针调用该成员函数;

  2. 若成员函数中使用了成员变量,须对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中&#xff0c;类内的成员变量和成员函数分开存储 我们知道&#xff0c;C中的成员变量和成员函数均可分为两种&#xff0c;一种是普通的&#xff0c;一种是静态的&#xff0c;对于静态成员变量和静态成员函数&#xff0c;我们知道他们不属于类的对象…...

SOA、分布式、微服务之间的关系和区别?

在当今的软件开发领域&#xff0c;SOA&#xff08;面向服务架构&#xff09;、分布式系统和微服务是三个重要的概念。它们各自有着独特的特性和应用场景&#xff0c;同时也存在着密切的关系。以下是关于这三者之间关系和区别的详细分析&#xff1a; 关系 分布式架构的范畴&…...

java基础概念46-数据结构1

一、引入 List集合的三种实现类使用了不同的数据结构&#xff01; 二、数据结构的定义 三、常见的数据结构 3-1、栈 特点&#xff1a;先进后出&#xff0c;后进先出。 java内存容器&#xff1a; 3-2、队列 特点&#xff1a;先进先出、后进后出。 栈VS队列-小结 3-3、数组 3-…...

Node.js-Mongodb数据库

MongoDB MongoDB是什么&#xff1f; MongoDB是一个基于分布式文件存储的数据库 数据库是什么&#xff1f; 数据库&#xff08;DataBase&#xff09;是按照数据结构来组织、存储和管理数据的应用程序&#xff08;软件&#xff09; 数据库作用&#xff1f; 对数据进行增、删…...

STM32 ADC --- 知识点总结

STM32 ADC — 知识点总结 文章目录 STM32 ADC --- 知识点总结cubeMX中配置注解单次转换模式、连续转换模式、扫描模式单通道采样的情况单次转换模式&#xff1a;连续转换模式&#xff1a; 多通道采样的情况禁止扫描模式&#xff08;单次转换模式或连续转换模式&#xff09;单次…...

技术创新与人才培养并重 软通动力子公司鸿湖万联亮相OpenHarmony人才生态大会

11月27日&#xff0c;由开放原子开源基金会指导&#xff0c;OpenHarmony项目群工作委员会主办的OpenHarmony人才生态大会2024在武汉隆重举办。软通动力子公司鸿湖万联作为OpenHarmony项目群A类捐赠人应邀出席。大会期间&#xff0c;鸿湖万联不仅深度参与了OpenHarmony人才生态年…...

兔子繁衍问题

7-2 兔子繁衍问题 分数 15 全屏浏览 切换布局 作者 徐镜春 单位 浙江大学 一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死&#xff0c;请问第1个月出生的一对兔子&#xff0c;至少需要繁衍到第几个月时兔…...

汉代风云人物 1晁错

晁错曾是汉景帝的老师。汉景帝登基后&#xff0c;晁错提出削藩建议&#xff0c;这一举措遭到诸多藩国诸侯的强烈反对&#xff0c;由此引发了紧张局势。 袁盎此前曾担任吴国的宰相&#xff0c;晁错觉得袁盎与吴国等藩国关系密切&#xff0c;很可能知晓藩王们谋反的相关情况却没…...

学习threejs,使用specularMap设置高光贴图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.MeshPhongMaterial高…...

【UE5 C++】判断两点连线是否穿过球体

目录 前言 方法一 原理 代码 测试 结果 方法二 原理 一、检查连线与球体的相交情况 二、检查距离与球体半径的关系 三、检查连线与球体的相交 代码 前言 通过数学原理判断空间中任意两点的连线是否穿过球体&#xff0c;再通过射线检测检验算法的正确性。 方法一 …...

【Blender】如何创建空心管道

步骤 1&#xff1a;创建一个圆柱体 添加圆柱体&#xff1a; 在 Object Mode 下按 Shift A > Mesh > Cylinder。 步骤 2&#xff1a;制作空心效果 进入编辑模式&#xff1a; 选中圆柱体&#xff0c;按 Tab 进入 Edit Mode。 删除顶部和底部面&#xff1a; 按 3 进入面选…...

ChromeBook11 HP G7EE 刷入Ubuntu的记录

设置开发模式-> 拆电池(解锁)-> 刷入bios ->使用u盘刷入系统。 下面是详细过程&#xff0c;除了拆机有点紧&#xff0c;没有难度(我不负责&#xff5e; 其实我试了好几次其他系统的&#xff0c;先进了pe&#xff0c;pe没问题(音频x)&#xff0c;有一个win10的u盘(几个…...

16asm - 汇编介绍 和 debug使用

文章目录 前言硬件运行机制微机系统硬件组成计算机系统组成8086cpu组织架构dosbox安装配置debug debug使用R命令D命令E命令U命令T命令A命令标志寄存器 总结 前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解 十六位汇编 和 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绘图

随着人工智能技术的飞速发展&#xff0c;ChatGPT等先进语言模型正深刻改变着科研工作的面貌。从科研灵感的激发、论文的高效撰写&#xff0c;到课题的成功申报&#xff0c;乃至复杂数据的深度分析与可视化呈现&#xff0c;AI技术均展现出前所未有的潜力。其实众多科研前沿工作者…...

原子类、AtomicLong、AtomicReference、AtomicIntegerFieldUpdater、LongAdder

原子类 JDK提供的原子类&#xff0c;即Atomic*类有很多&#xff0c;大体可做如下分类&#xff1a; 形式类别举例Atomic*基本类型原子类AtomicInteger、AtomicLong、AtomicBooleanAtomic*Array数组类型原子类AtomicIntegerArray、AtomicLongArray、AtomicReferenceArrayAtomic…...

c语言——数组名该如何理解呢?

一般情况下&#xff0c;数组名表示首元素地址&#xff0c;以下2种除外&#xff1a; ①、sizeof(数组名) 表示整个数组 ※只有数组名的情况 sizeof&#xff08;数组名i&#xff09; 就不能表示整个数组 ②、&数组名 表示整个数组&#xff0c;取的是整个数…...

Linux学习笔记13 系统进程管理

前文 Linux学习笔记10 系统启动初始化&#xff0c;服务和进程管理&#xff08;上&#xff09;-CSDN博客 Linux学习笔记11 系统启动初始化&#xff0c;服务和进程管理&#xff08;下&#xff09;-CSDN博客 Linux学习笔记12 systemd的其他命令-CSDN博客 之前学习了怎么使用sy…...

Spring Boot 项目集成camunda流程引擎

Spring Boot 项目集成camunda流程引擎 camunda地址 camunda中文地址 使用camunda开源工作流引擎有&#xff1a;通过docker运行、使用springboot集成、部署camunda发行包、基于源代码编译运行等多种方式。 文本重点介绍如何在Spring Boot应用程序中如何集成Camunda Platform开…...

2024.12.2工作复盘

1.今天学了什么&#xff1f; 简单的写了一篇博客&#xff0c;是关于参数校验的问题&#xff0c;参数校验&#xff0c;一个是前后端校验到底一不一致&#xff0c;一个是绕过前端校验&#xff0c;看后台的逻辑到底能不能校验住。 2.今天解决了什么问题&#xff1f; 3.今天完成…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...