【带头学C++】----- 九、类和对象 ---- 9.11 面向对象模型

news2024/10/6 1:37:46

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️麻烦您点个关注,不迷路❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️

目    录

9.11 面向对象的框架模型

9.11.1 成员变量与函数的存储架构

代码举例说明:

 9.11.2 this指针

9.11.4 this指针的应用

1. 函数形参与普通成员变量同名,此时可以使用this指针解决

2. this来完成链式操作

9.11.5 const修饰成员函数

点赞👍  + 收藏👐 + 关注👌


9.11 面向对象的框架模型

9.11.1 成员变量与函数的存储架构

        C++面向对象最重要的特征之一,就是实现了“封装”、“数据”以及“函数(里面是对数据的操作)”是分别存储的,c++中的非静态数据成员直接内含在类对象中,成员函数虽然内含在class声明之内,却不出现在对象中。 每一个非内联成员函数只会诞生一份函数实例。

此时我们需要考虑一个问题,使用sizeof(Data)计算类的对象所占空间大小是多少?

实际上,我们这个类的大小只有a、和b的大小

  • char类型的大小通常是1字节。
  • int类型的大小通常是4字节。
  • 静态成员变量不会增加对象的大小,因为它们是类的共享资源。

 记住内存对齐原则:对齐是自身类型的整数倍,并且对象的大小包括其成员变量的大小和可能引发的对齐要求所增加的填充字节

代码举例说明:

 结果显示:

源码:

class myClass01{
public:
    int num1;
};
class myClass02{
public:
    int num1;
    static int num2;
};
class myClass03{
public:
    void myoutClass(){
        cout<<"我是03"<<endl;
    }
public:
    int num1;
    static int num2;
};
class myClass04{
public:
    void myoutClass(){
        cout<<"我是04"<<endl;
    }
    static void mycoutclass(){
        cout<<"我是04 static"<<endl;
    }
public:
    int num1;
    static int num2;
};
class myClass05{
public:
    void myoutClass(){
        cout<<"我是04"<<endl;
    }
    static void mycoutclass(){
        cout<<"我是04 static"<<endl;
    }
public:
    int num1;
    char name;
    static int num2;
};

void test03(){
    myClass01 my_1;
    myClass02 my_2;
    myClass03 my_3;
    myClass04 my_4;
    myClass05 my_5;
    cout<<"myClass01_my_1 : "<<sizeof (my_1) <<endl;//4
    //静态成员变量不在类对象中存储
    cout<<"myClass02_my_2 : "<<sizeof (my_2) <<endl;//4
    //非静态成员函数不在类对象中
    cout<<"myClass03_my_3 : "<<sizeof (my_3) <<endl;//4
    //静态成员函数不在类对象中
    cout<<"myClass04_my_4 : "<<sizeof (my_4) <<endl;//4

    //增加一个char成员变量,变成8字节,内存对齐
    cout<<"myClass05_my_5 : "<<sizeof (my_5) <<endl;//8字节

    //直接计算类的大小看一下
    cout<<"myClass01 : "<<sizeof (myClass01) <<endl;//4
    cout<<"myClass02 : "<<sizeof (myClass02) <<endl;//4
    cout<<"myClass03 : "<<sizeof (myClass03) <<endl;//4
    cout<<"myClass04 : "<<sizeof (myClass04) <<endl;//4
    cout<<"myClass05 : "<<sizeof (myClass05) <<endl;//8字节

}

总结:c++类的大小,或者说类创建的对象的存储变量和函数,是分开存储的。只需要计算普通成员变量和普通通成员指针的大小就可以了,但是记住考虑内存对齐。接着我们来继续深入学习this指针. 

 9.11.2 this指针

根据上面可以知道,成员函数没有存储在对象的内存空间,那C++是如何知道此时对象调用的是哪个对象的成员函数呢?怎么才能知道当前,是不是调用自己的那个成员函数的?

        在C++中,成员函数的调用是通过函数指针来实现的,这个函数指针被称为“this指针”,它作为成员函数的隐式参数传递给函数。成员函数通过this指针即可知道操作的是哪个对象的数据。this指针是一种隐含指针,它隐合于每个类的非静态成员数中。this指针无需定义,直接使用即可

        当调用一个成员函数时,编译器会在编译时将函数中的this关键字替换为指向调用对象的指针,并将这个指针传递给函数。因此,成员函数可以访问它所属的对象的所有成员变量和函数,而不需要显式地传递对象的地址或引用。
        注意:静态成员函数内部没有this指针,静态成员函数不能操作非静态成员变量

图中所有文字解释都要认真记忆观看,如有所思,必能大成。 

9.11.4 this指针的应用

1. 函数形参与普通成员变量同名,此时可以使用this指针解决

2. this来完成链式操作

代码:

class Data4
{
public:
    Data4& printData(const char * str){
        cout <<str<<" ";
        return *this;
    }
};
void test05(){
    Data4().printData("Jery").printData("Tom").printData("Spike");//链式操作
}

9.11.5 const修饰成员函数

      在C++中用const修饰一个成员函数时,const修饰this指针指向的内存区域,成员函数体内不可以修改本类中的任何普通成员变量,它被称为“常量成员函数”。常量成员函数承诺不会修改对象的状态。

也就是说,在常量成员函数内部,不允许修改成员变量的值(除非该成员变量被声明为mutable)。

代码:

class Data5{
public:
    int a;
    int b;
    mutable int c;
public:
    Data5(int a,int b,int c){
        this->a = a;
        this->b = b;
        this->c = c;
    }
    void showNum(void) const  //增加const只读,不可以修改成员变量
    {
        //a = 100;//error 直接报错
        c = 101;
        cout <<" a: "<<a<<" b: "<<b<<" c: "<<c<<endl;
    }
};
void test06(){
    Data5 ob1(11,18,36);
    ob1.showNum();
}

C++既提供了这样很好的封装性,也提供了不同的方法去破坏这样的封装性,实际上从用户开发角度出发,可以满足大部分场景需求,也能满足多样化实现的步骤。

例如,对于访问private类型私有成员数据的时候。我们只能通过public共有方法去访问私有数据,但是C++还提供了一种可以直接访问private类型的方法------下章节详细介绍一下这个方法(友元函数,祝我们都很有圆子😍😍😍)

点赞👍  + 收藏👐 + 关注👌

❤️您的支持❤️,是博主最大的动力❤️!!互相学习❤️!!共同进步❤️!!一起搞钱❤️!!❤️

  ⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️十星好评,Erike的专用模板⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

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

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

相关文章

线程互斥与同步

用户级线程 内核的LWP Linux线程 OS概念中经常说的 用户级线程 和 内核级线程 也就是线程实现真的是在OS内部实现&#xff0c;还是应用层或用户层实现 很明显Linux是属于用户级线程 用户级执行流&#xff08;用户级线程&#xff09; &#xff1a;内核lwp 1 : 1 也有1&…

Anaconda+Pytorch(GPU版)深度学习环境配置笔记

主要参考以下文章进行配置&#xff1a; https://blog.csdn.net/qq_43757976/article/details/131173301 配置版本略有更新&#xff0c;最新版本时间为2023.12.11 一、准备工作 个人电脑配置&#xff1a;laptop RTX4060 win11 个人配置版本&#xff1a;cuda&#xff08;12.1&…

虹科Pico汽车示波器 | 汽车免拆检修 | 2019款别克GL8豪华商务车前照灯水平调节故障

一、故障现象 一辆2019款别克GL8豪华商务车&#xff0c;搭载LTG发动机&#xff0c;累计行驶里程约为10.7万km。车主反映&#xff0c;车辆行驶过程中组合仪表提示前照灯水平调节故障。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上提示“前照灯水平调节…

OWASP ESAPI 预防XSS跨站脚本攻击

跨站脚本攻击XSS案例&#xff1a;跨站脚本攻击XSS案例及其解决方案_xss攻击案例-CSDN博客 Java集成&#xff1a; 1、引入maven <!--OWASP ESAPI&#xff0c;防御 XSS跨站攻击--><dependency><groupId>org.owasp.esapi</groupId><artifactId>esa…

90%的人都值得学习微信商城的准备工作,7个关键步骤

如何做一个小程序卖东西&#xff1f;90%的人都不知道微信商城的准备工作 近几年&#xff0c;随着疫情的影响和电商的崛起&#xff0c;实体生意大家都变得越来越难做&#xff0c;越来越多的企业老板开始把矛头转向成本费用比实体门店更加低的微商城小程序&#xff0c;通过小程序…

微信小程序 bindtap 事件多参数传递

在微信小程序中&#xff0c;我们无法直接通过 bindtap"handleClick(1,2,3)" 的方式传递参数&#xff0c;而是需要通过自定义属性 data- 的方式进行传递&#xff0c;并在事件回调函数中通过 event.currentTarget.dataset 来获取这些参数。然而&#xff0c;这种传参方式…

【FPGA】数字电路设计基础

数字电路基础 1 什么是数字电路 在学习数字电路之前&#xff0c;我们先要了解下什么是数字电路。想要搞明白数字电路&#xff0c;就要搞明白生活中有 两种概念&#xff0c; 数字信号和模拟信号&#xff0c;模拟信号一般包括压力、气温、速度等信号&#xff0c;模拟量的值是可…

4s店3D虚拟云展厅让看车变得更加便捷和高效

汽车企业7203D虚拟全景展示的特点和优势主要体现在以下几个方面&#xff1a; 逼真的观赏和试乘体验&#xff1a;7203D虚拟全景展示利用虚拟现实技术&#xff0c;提供了高度逼真的汽车观赏和试乘体验。消费者可以在虚拟环境中更加深入地了解汽车的外观、内饰和功能特点&#xff…

【mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar安装】linux安装mysql5.7

之前安装的时候遇到了很多问题&#xff0c;浪费了一些时间。整理出这份教程&#xff0c;照着做基本一遍过。 这是安装包: 链接&#xff1a;https://pan.baidu.com/s/1gBuQBjA4R5qRYZKPKN3uXw?pwd1nuz 1.下载安装包&#xff0c;上传到linux。我这里就放到downloads目录下面…

阻抗控制下机器人接触刚性环境振荡不稳定进行阻抗调节

在阻抗控制下&#xff0c;当机器人接触刚性环境时&#xff0c;可能会出现振荡不稳定的情况。这可以通过调整机器人的阻抗参数来进行调节。 阻抗接触 阻抗参数中的质量、阻尼和刚度都会对机器人控制系统的性能和稳定性产生重要影响。质量主要影响系统的惯性&#xff0c;从而影响…

【网络安全】CTF入门教程(非常详细)从零基础入门到进阶,看这一篇就够了!

一、CTF简介 CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。…

ELK综合案例

综合案例 ELKfilebeatnginxjson nginx配置 1,在nginx服务器上安装nginx # yum install epel-release # yum install nginx 2,将nginx日志改成json格式,这样各个字段就方便最终在kibana进行画图统计了 # vim /etc/nginx/nginx.conf ​ http {log_format main $remote_ad…

Rust 学习

Rust 官网&#xff1a;https://www.rust-lang.org/zh-CN/ 1、Rust 简介 Rust 是一门注重安全&#xff08;safety&#xff09;、速度&#xff08;speed&#xff09;和并发&#xff08;concurrency&#xff09;的现代系统编程语言。Rust 通过内存安全来实现以上目标&#xff0c;但…

Faster R-CNN pytorch源码血细胞检测实战(二)数据增强

Faster R-CNN pytorch源码血细胞检测实战&#xff08;二&#xff09;数据增强 文章目录 Faster R-CNN pytorch源码血细胞检测实战&#xff08;二&#xff09;数据增强1. 资源&参考2. 数据增强2.1 代码运行2.2 文件存放 3 数据集划分4. 训练&测试5. 总结 1. 资源&参…

kafka windows版本的下载安装,并且本地使用(亲测有效)

目录 1 问题2 下载 1 问题 本地启动一个kafka &#xff0c;然后可以实现生产者 消费者 2 下载 https://downloads.apache.org/kafka/ 选择一个版本下载 下载之后解压 修改配置 修改好之后&#xff0c;就保存&#xff0c;之后先启动zookper &#xff0c;之后再启动 ka…

Mybatis-Plus 3.3.2 发布,新增优雅的数据安全保护姿势[MyBatis-Plus系列]

Hi,大家好,我是悟纤。过着爱谁谁的生活,活出不设限的人生。 存在数据库中的数据对于普通用户而言是不可见的,好像是藏起来了一样,但对于开发者,只要知道数据库的连接地址、用户名、密码,则数据不再安全;这也意味着,一旦连接数据库的配置文件暴露出去,则数据不再安全…

聚焦中国—东盟大健康产业峰会 点靓广西“长寿福地”品牌

12月8-10日2023中国—东盟大健康产业峰会暨大健康产业博览会在南宁国际会展中心成功举办&#xff0c;本次峰会由国家中医药管理局、广西壮族自治区人民政府联合主办&#xff0c;中国老年学和老年医学学会、自治区党委宣传部、自治区民政厅、广西壮族自治区外事办公室、广西壮族…

SQL窗口函数OVER用法整理

文章目录 SQL窗口函数OVER用法整理 SQL窗口函数OVER用法整理 OVER的定义 OVER用于为行定义一个窗口&#xff0c;它对一组值进行操作&#xff0c;不需要使用GROUP BY子句对数据进行分组&#xff0c;能够在同一行中同时返回基础行的列和聚合列。 语法 OVER ( [ PARTITION BY c…

核心大表7亿数据,查询性能快40倍!科大讯飞HTAP探索实践

科大讯飞在 2021 年关注原生分布式数据库&#xff0c;并于 2023 年 7 月在核心业务落地 OceanBase&#xff0c;实现了业务稳定运行、灵活扩缩容&#xff0c;以及一套系统处理 TP 和 AP 业务且互不影响。并带来了意外收获&#xff0c;即存储成本下降 50%、运维复杂度极大简化。科…

五年制专转本备考冲刺阶段,老师给你六点建议助你上岸

1、热衷的不是学习&#xff0c;而是思考 人与人之间最大的差别在于思维的差别&#xff0c;也可以说是思考的差别。专转本也是如此&#xff0c;有人思考得简单&#xff0c;有人思考得复杂&#xff1b;有人想得全面&#xff0c;有人想得肤浅。 只有善于思考&#xff0c;才会对问…