C++类和对象_02----对象模型和this指针
目录
- C++对象模型和this指针
- 1、成员变量和成员函数分开存储
- 1.1、空类大小
- 1.2、非空类大小
- 1.3、结论
- 2、this指针概念
- 2.1、解决名称冲突
- 2.2、在类的非静态成员函数中返回对象本身,可使用return *this
- 2.3、拷贝构造函数返回值为引用的时候,可进行链式编程
- 3、空指针访问成员函数
- 3.1、访问ShowClassName()成员函数
- 3.2、访问ShowPeopleAge()成员函数
- 4、const修饰成员函数
- 4.1、常函数
- 4.1.1、 常函数本质是对this指针的修改
- 4.1.2、成员属性声明时加关键字mutable后,可在常函数中修改
- 4.2、常对象
C++对象模型和this指针
1、成员变量和成员函数分开存储
在C++中,类内的成员变量和成员函数分开存储
只有非静态成员变量才属于类的对象上
1.1、空类大小
class MyPeople
{
};
void Class_Func_Constructor_Member()
{MyPeople p1;cout << "空对象占用的内存空间为: " << sizeof(p1) << " 字节"<< endl;
}
运行结果:

C++ 会为每个空对象分配一个字节的内存空间,是为了区分空对象占内存的位置。每个空对象都有一个独一无二的地址
1.2、非空类大小
class MyPeople07
{
public:int m_a;//非静态成员变量,属于类的对象上,计算类对象大小时需要计算static int m_b;//静态成员变量,不属于类的对象上,计算类对象大小时不需要计算void func() //非静态成员函数,不属于类的对象上 ,计算类对象大小时不需要计算{}static void func2() //静态成员函数,不属于类的对象上 ,计算类对象大小时不需要计算{}};
void Class_Func_Constructor_Member()
{MyPeople07 p2;cout << "非空对象占用的内存空间为: " << sizeof(p2) << " 字节" << endl;
}
运行结果:

1.3、结论
由此可知,在类中,只有非静态成员变量才属于类的对象上,在计算类对象大小时,只需要考虑非静态成员变量的种类和个数。
2、this指针概念
在C++中成员变量和成员函数是分开存储的。每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
问题:这一块代码是如何区分那个对象调用自己的呢?
c++通过提供特殊的对象指针,this指针,解决上述问题。
(1)this指针指向被调用的成员函数所属的对象
(2)this指针是隐含每一个非静态成员函数内的一种指针
(3)this指针不需要定义,直接使用即可
this指针的用途:
(1)当形参和成员变量同名时,可用this指针来区分。解决名称冲突
(2)在类的非静态成员函数中返回对象本身,可使用return
2.1、解决名称冲突
当形参和成员变量同名时,可用this指针来区分
this指针 指向 被调用的成员函数 所属的对象
class MyPeople08
{
public:MyPeople08(int age){this->age = age;}int age;
};
void Class_Func_Constructor_this_ptr()
{//解决名称冲突MyPeople08 p1(10);cout << "p1 AGE : " << p1.age << endl;
}
运行结果:

2.2、在类的非静态成员函数中返回对象本身,可使用return *this
class MyPeople09
{
public:MyPeople09(int age){this->age = age;}MyPeople09& PeopleAddAge(MyPeople09 &p){this->age += p.age;return *this; //this 是指向对象的指针,*this就是对象本身}int age;
};
void Class_Func_Constructor_this_ptr()
{//返回对象本身用 *thisMyPeople09 p1(10);cout << "p1 AGE : " << p1.age << endl;MyPeople09 p2;p2.PeopleAddAge(p1);cout << "p2 AGE : " << p2.age << endl;
}
运行结果:

2.3、拷贝构造函数返回值为引用的时候,可进行链式编程
class MyPeople08
{
public:MyPeople08(int age){this->age = age;}MyPeople08& PeopleAddAge(MyPeople08 &p){this->age += p.age;return *this;}int age;
};
void Class_Func_Constructor_this_ptr()
{MyPeople08 p1(10);cout << "p1 AGE : " << p1.age << endl;MyPeople08 p2(10);cout << "p2 AGE : " << p2.age << endl;//链式调用p2.PeopleAddAge(p1).PeopleAddAge(p1).PeopleAddAge(p1);cout << "链式调用后 p2 AGE : " << p2.age << endl;
}
运行结果:

注意:当拷贝构造函数返回值为类名时,结果如下:

原因:
MyPeople08 对象 作为返回值会触发编译器提供的浅拷贝,返回的对象跟原来的对象不是同一块内存;
MyPeople08 & 对象 作为返回值,那么接收的变量就是原来对象的一个别名,操纵同一块内存
链式调用目的是 在原数据改变的基础上 递增 ,引用是地址传递 会改变原有的值,不用引用就变成复制操作了
3、空指针访问成员函数
class MyPeople09
{
public:void ShowClassName(){cout << "This is MyPeople09 class !" << endl;}void ShowPeopleAge(){cout << "age = " << this->m_Age << endl;}int m_Age;
};
3.1、访问ShowClassName()成员函数
void Class_Func_Constructor_nullptr_func()
{MyPeople09 *p1 = NULL;p1->ShowClassName();
}
运行结果:

3.2、访问ShowPeopleAge()成员函数
void Class_Func_Constructor_nullptr_func()
{MyPeople09 *p1 = NULL;p1->ShowPeopleAge();
}
报错!!!

因为对于传入的指针为NULL函数来说,
其中的 cout << "age = " << m_Age << endl;相当于 cout << "age = " << this->m_Age << endl; 默认会自动加上this指针
此时,调用该函数时,传入的指针为NULL,再通过NULL->m_Age访问,就会出现问题。
修改方式如下:
在传入的指针为NULL函数中增加对空指针的判断即可
void ShowPeopleAge(){//解决方式:增加对空指针的判断if (this == NULL){return;}cout << "age = " << this->m_Age << endl;}
4、const修饰成员函数
4.1、常函数
成员函数后加const后我们称为这个函数为常函数
特性:
1、常函数内不可以修改成员属性
2、成员属性声明时加关键字mutable后,在常函数中依然可以修改
4.1.1、 常函数本质是对this指针的修改
this指针的本质是一个 “指针常量”( MyPeople10 * const this ),表示:指针的指向不可修改;
在常函数中,该指针被进一步限定为 : const MyPeople10 * const this 表示:指针的指向不可修改并且指向的内容不能被修改。
此时,如果通过this指针修改成员变量的值,编译器会报错:不可修改的左值。如图:

4.1.2、成员属性声明时加关键字mutable后,可在常函数中修改

4.2、常对象
声明对象前加const 称该对象为 常对象
void Class_Func_Constructor_const_func()
{const MyPeople10 p1; //在对象前加 const 即为 常对象//p1.m_A = 123; //不可修改普通成员变量p1.m_B = 789; //mutable特殊变量,在常对象中可以修改值p1.ShowMyPeople10Class(); //常对象只能调用常函数p1.func(); //
}
常对象只能调用常函数

相关文章:
C++类和对象_02----对象模型和this指针
目录C对象模型和this指针1、成员变量和成员函数分开存储1.1、空类大小1.2、非空类大小1.3、结论2、this指针概念2.1、解决名称冲突2.2、在类的非静态成员函数中返回对象本身,可使用return *this2.3、拷贝构造函数返回值为引用的时候,可进行链式编程3、空…...
瑞芯微RK3568开发:烧录过程
进入rk3568这款芯片的烧录模式共有3种方式,先讲需要准备的环境要求。 一、软硬件环境 1、配套sdk版本的驱动DriverAssitant_vx.x.x和RKDevTool_Release_vx.x,版本不对应可能无法烧录,建议直接在sdk压缩包里获取; 2、如果正确安…...
【数据结构】——树和二叉树的概念
目录 1.树概念及结构 1.1树的概念 1.2 树的相关性质 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1二叉树概念 2.2 特殊的二叉树 2.3 二叉树的性质 1.树概念及结构 1.1树的概念 树是一种非线性的数据结构…...
Meta分析在生态环境领域里的应用
Meta分析(Meta Analysis)是当今比较流行的综合具有同一主题的多个独立研究的统计学方法,是较高一级逻辑形式上的定量文献综述。20世纪90年代后,Meta分析被引入生态环境领域的研究,并得到高度的重视和长足的发展&#x…...
PrivateLoader PPI服务发现RisePro恶意软件窃取分发信息
称为PrivateLoader的按安装付费(PPI)软件下载器服务正用于恶意软件RisePro的信息窃取。Flashpoint 于 2022 年 12月13日发现了新的窃取者,此前发现了在名为Russian Market的非法网络犯罪市场上使用该恶意软件泄露的“几组日志”。RisePro是一…...
SQL93 返回购买 prod_id 为 BR01 的产品的所有顾客的电子邮件(一)
描述你想知道订购 BR01 产品的日期,有表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date;Customers表含有cust_email 顾客邮件和cust_id顾客idOrderItems表prod_idorde…...
Git ---- 概述
Git ---- 概述1. 何为版本控制2. 为什么需要版本控制3. 版本控制的工具集中式版本控制工具分布式版本控制工具4. Git 简史5. Git 工作机制6. Git 和代码托管中心Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。 Git 易于学…...
用 tensorflow.js 做了一个动漫分类的功能(二)
前言:前面已经通过采集拿到了图片,并且也手动对图片做了标注。接下来就要通过 Tensorflow.js 基于 mobileNet 训练模型,最后就可以实现在采集中对图片进行自动分类了。这种功能在应用场景里就比较多了,比如图标素材站点࿰…...
小林coding
一、图解网络 问大家,为什么要有TCP/Ip网络模型? 对于同一台设备上的进程通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,对于不同设备上的进程通信,就需要有网络通信,而设备是…...
操作系统真相还原_第6章:完善内核
文章目录6.1 函数调用约定简介6.2 汇编语言和C语言混合编程汇编调用CC调用汇编6.3 实现打印函数流程程序编译并写入硬盘执行6.4 内联汇编简介汇编语言AT&T语法基本内联汇编扩展内联汇编6.1 函数调用约定简介 调用约定: calling conventions 调用函数时的一套约…...
SmoothNLP新词发现算法的改进实现
SmoothNLP新词发现算法的改进实现 背景介绍 新词发现也叫未登录词提取,依据 《统计自然语言处理》(宗成庆),中文分词有98%的错误来自"未登录词"。即便早就火遍大江南北的Bert也不能解决"未登录词"的Encoding问题,便索性…...
实时渲染为什么快,能不能局域网部署点量云
提到渲染很多有相关从业经验的人员可能会想起,自己曾经在电脑上渲染一个模型半天或者更长的 时间才能完成的经历。尤其是在项目比较着急的时候,这种煎熬更是难受。但现在随着实时渲染和云渲染行业的发展,通过很多方式可以提升渲染的时间和效率…...
网络游戏该如何防护ddos/cc攻击
现在做网络游戏的企业都知道服务器的安全对于我们来说很重要!互联网上面的 DDoS 攻击和 CC 攻击等等无处不在,而游戏服务器对服务器的防御能力和处理能力要求更高,普通的服务器则是比较注重各方面能力的均衡。随着游戏行业的壮大,…...
项目管理体系1-4练习题1-10答案
题目1 每周一次的项目会议上,一位团队成员表示在修订一项可交付成果时,一名销售经理对客户服务过程想出一项变更讨论,影响到整个项目,项目经理对销售参与到项目可交付成果感到吃惊,经理事先应该怎么做去阻止这些情况&…...
sHMIctrl智能屏幕使用记录
手上有个案子,“按压机器人”,功能是恒定一个力按下一定时间。 屏幕选型使用“sHMIctrl”,一下记录使用过程中遇到的问题以及解决方法。 目录 问题1:按键控件做定时触发,模拟运行时触发不了。 问题2:厂家…...
2.20 crm day01 配置路由router less使用 axios二次封装
需求: 目录 1.配置路由 2.less使用 vue2使用以下版本 3.axios二次封装 1.配置路由 1.1.1 官方链接:安装 | Vue Router npm i vue-router3.6.5 注意:vue2项目不能用vue-router四版本以上 1.2.1.创建router/index.js 在该文件中 //1.引…...
【LeetCode】剑指 Offer 10- I. 斐波那契数列 p74 -- Java Version
题目链接: 1. 题目介绍() 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下: F(0) 0, F(1) 1F(N) F(N - 1) F…...
论文笔记:DropMessage: Unifying Random Dropping for Graph Neural Networks
(AAAI 23 优秀论文) 1 intro GNN的一个普遍思路是,每一层卷积层中,从邻居处聚合信息 尽管GNN有显著的进步,但是在大规模图中训练GNN会遇到各种问题: 过拟合 过拟合之后,GNN的泛化能力就被限制…...
木鱼cms系统审计小结
MuYuCMS基于Thinkphp开发的一套轻量级开源内容管理系统,专注为公司企业、个人站长提供快速建站提供解决方案。 环境搭建 我们利用 phpstudy 来搭建环境,选择 Apache2.4.39 MySQL5.7.26 php5.6.9 ,同时利用 PhpStorm 来实现对项目的调试 …...
软件测试面试-一线大厂必问的测试思维面试题
五、测试思维5.1 打电话功能怎么去测?我们会从几个方面去测试:界面、功能、兼容性、易用性、安全、性能、异常。1)界面我们会测试下是否跟界面原型图一致,考虑浏览器不同显示比例,屏幕分辨率。2)功能&#…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
