【C++】类与对象(1)

news2024/10/6 18:44:59

【C++】类与对象(1)

作者:爱写代码的刚子
时间:2023.4.29
本篇博客是有关C++类与对象的知识,学习了类与对象就相当于一只脚踏进了C++的大门,本篇博客会深入讲解C++中的类与对象(重点为this指针)。

目录

  • 【C++】类与对象(1)
      • 类的初步认识
      • 类的定义
      • 类的访问限定符及封装
          • 访问限定符
          • 类的封装
      • 类的作用域
      • 类的实例化
      • 类对象模型
          • 计算类的大小
      • this指针
          • this指针的特性(重要)

类的初步认识

  • C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
  • C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
    C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数,但是C++中更喜欢用class代替struct来定义类。

类的定义

class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号(和java不同)。 类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的方法或者成员函数。

  • 类的两种定义方式:
  1. 声明和定义全部放在类体中,需要注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
  2. 声明放在.h文件中,类的定义放在.cpp文件中。(推荐)

类的访问限定符及封装

访问限定符

C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其 接口提供给外部的用户使用。
在这里插入图片描述
访问限定符说明:

  1. public修饰的成员在类外可以直接被访问
  2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  4. class的默认访问权限为private,struct为public(因为struct要兼容C)(C++中struct定义的类和class定义的类的不同之处(重要))
类的封装

面向对象的三大特征:封装、继承、多态

封装:将数据和操作数据的方法进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行
交互。
封装本质上是一种管理:我们使用类数据和方法都封装到一下,不想给别人看到的,我们使用protected/private把成员封装起来。开放一些共有的成员函数对成员合理的访问。所以封装本质是一种管理。

类的作用域

类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体定义成员,需要使用 :: 作用域解析符指明成员属于哪个类域。
错误示范:
在这里插入图片描述
正确的代码:
在这里插入图片描述

类的实例化

类的实例化:用类类型创建对象的过程,称为类的实例化(对象的定义)

  1. 类只是一个模型一样的东西,限定了类有哪些成员,定义出一个类并没有分配实际的内存空间来存储它
  2. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
  3. 类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间

类对象模型

计算类的大小
  • 计算类的大小时只算成员变量,不算成员函数
  • 对象中只储存成员变量,没有储存成员函数(成员函数存储在一个公共的区域(类成员函数表),因为使用不同的类,成员变量不同,但成员函数相同)
  • 计算类的大小时要内存对齐(博客链接:内存对齐)
    在这里插入图片描述
    结果:
    在这里插入图片描述
    A2和A3两个类对象没有成员变量,需要1byte,是为了占位,表示对象在,不存储有效数据
  • 注:
A1 aa1;
aa1.print();

这里并不是代表aa1去找print()函数的地址,类里面并没有存2成员函数的地址。

this指针

提出问题:
之前有提到类里面的成员函数不存储在类里面,而是存储在另外一个公共区域,观察以下代码,既然调用的是同一个函数,那为什么输出结果不同?(如何知道函数设置的不同对象?)
在这里插入图片描述

在这里插入图片描述
解答:

  • C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数”增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
    实际上编译器进行的操作:
    在这里插入图片描述
    在这里插入图片描述
this指针的特性(重要)
  • this指针不允许在实参和形参位置显式传递!!!,但可以在函数内部显式使用
  • this的指针类型是const如以上代码this指针类型为Date* const this
  • this指针本质上其实是一个成员函数的形参,是对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针(this指针存在栈中(和普通参数一样,作为栈帧的一部分,函数结束,this指针销毁))。
  1. this指针是成员函数第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递

观察以下代码:

class A
{
public:
    void PrintA()
    {
        cout << _a << endl;
    }
    void Show() {
        cout << "Show()" << endl;
    }
private:
    int _a;
};
int main() 
{
    A* p = nullptr;
    p->PrintA();
    p->Show();
    return 0;
}

p->PrintA();不能执行,而p->Show();却可以执行
解答:
这里的p是空指针,编译器在公共的区域找成员函数,p作为this指针传入成员函数(传空指针不会报错),p->PrintA();和p->Show();这个过程中都没有发生解引用(PrintA和Show函数的地址不在对象中(在公共代码段))但是进入到函数内部时,PrintA函数中this->_a这个代码发生了解引用,所以报错。 理解这个过程很重要(传空指针不一定报错)。
从底层看并没有发生解引用:
在这里插入图片描述
(没有解引用,只是调用了call)

  • vs下面对this指针传递进行优化,对象地址是放在ecx,ecx存储this指针的值(linux与vs不同)

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

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

相关文章

C++知识点 -- 异常

C知识点 – 异常 文章目录 C知识点 -- 异常一、异常概念二、异常的使用1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范 三、自定义异常体系四、C标准库的异常体系五、C异常的优缺点 一、异常概念 当一个函数发现自己无法处理错误时&#xff0c;就可以抛出异常&#…

Python超矩形

文章目录 距离函数矩形分割 Rectangle是 scipy.spatial中封装的类&#xff0c;其构造函数只需输入最小值和最大值的数组即可&#xff0c;并且可通过内置的 volume方法计算广义的体积。 from scipy.spatial import Rectanglerec Rectangle((0,0), (5,5)) print(rec.maxes) …

java-会话技术

1.1 会话管理概述 1.1.1 什么是会话 这里的会话&#xff0c;指的是web开发中的一次通话过程&#xff0c;当打开浏览器&#xff0c;访问网站地址后&#xff0c;会话开始&#xff0c;当关闭浏览器&#xff08;或者到了过期时间&#xff09;&#xff0c;会话结束。 举个例子&am…

py_rabbitmq

安装 服务端 https://www.jianshu.com/p/2fb6d5ac17b9 客户端 pip install pika文档 https://rabbitmq.com/tutorials/tutorial-one-python.html 简单示例 生产者 import pika import rabbitmq_study.settings as settingscredentials pika.PlainCredentials(settings…

Python每日一练(20230430)

目录 1. 移除元素 &#x1f31f; 2. 删除排序链表中的重复元素 &#x1f31f; 3. 搜索旋转排序数组 II &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1.…

总结836

学习目标&#xff1a; 4月&#xff08;复习完高数18讲内容&#xff0c;背诵21篇短文&#xff0c;熟词僻义300词基础词&#xff09; 学习内容&#xff1a; 暴力英语&#xff1a;背诵《keep your direction》&#xff0c;默写&#xff0c;英语语法 高等数学&#xff1a;刷题&a…

node笔记_安装nvm管理node版本

文章目录 前言下载nvm安装nvmnvm路径node路径查看版本nvm -v查看nvm的node版本列表&#xff08;nvm list available&#xff09;配置nvm的镜像库mirror选择node版本安装 (node install version)使用指定的node版本&#xff08;nvm use&#xff09; node环境变量配置配置NODE_PA…

【打卡】图像检索与匹配4 孪生网络

任务4&#xff1a;孪生网络 孪生网络是一种由两个相同结构的神经网络组成的模型&#xff0c;其目的是将两个输入数据映射到一个共同的向量空间中&#xff0c;并计算它们之间的相似度或距离。它通常用于图像匹配、人脸识别、语义匹配等任务中。 步骤1&#xff1a;构建三元组数…

MIT 6.824 lab4A总结

Background 一个raft集群的性能很明显和raft的数量有关系&#xff0c;更重要的是如果我们多个key放在一个raft集群里&#xff0c;这样的并行性不太好。所以我们可以考虑分片&#xff0c;利用操作潜在的并行性来提升性能。每一个副本组只管理几个分片的put和get&#xff0c;并且…

网络基础设施 拥塞控制

我经常说&#xff0c;传统的 TCP 优化已经到顶&#xff0c;不会有大意义了&#xff0c;这有两方面意思。 一方面&#xff0c;内在的&#xff0c;TCP 的 ACK 时钟带回的信息就那么多&#xff0c;用足了又能怎样。一个学习最差的差生能控制的分数是是 0&#xff5e;100 分的区间…

【Linux】基础IO——文件系统|软硬链接|动静态库

文章目录 一、磁盘1. 物理结构2. 存储结构3. 逻辑抽象结构 二、文件系统1. 文件系统的结构2. 查看文件3. 删除文件 三、软硬链接1. 软链接2. 硬链接3. ACM 时间 四、动静态库1. 动静态库的介绍2. 静态库的制作3. 动态库的制作4. 动态库的加载 一、磁盘 基于上篇博客所写到的文…

从0搭建Vue3组件库(十一): 集成项目的编程规范工具链(ESlint+Prettier+Stylelint)

欲先善其事,必先利其器。一个好的项目是必须要有一个统一的规范,比如代码规范,样式规范以及代码提交规范等。统一的代码规范旨在增强团队开发协作、提高代码质量和打造开发基石,所以每个人必须严格遵守。 本篇文章将引入 ESLintPrettierStylelint 来对代码规范化。 ESlint ES…

【计算机网络】学习笔记:第三章 数据链路层(八千字详细配图)【王道考研】

基于本人观看学习b站王道计算机网络课程所做的笔记&#xff0c;不做任何获利 仅进行交流分享 特此鸣谢王道考研 若有侵权请联系&#xff0c;立删 如果本篇笔记帮助到了你&#xff0c;还请点赞 关注 支持一下 ♡>&#x16966;<)!! 主页专栏有更多&#xff0c;如有疑问欢迎…

redhat 8.7 安装oracle 11g-11.2.0.4

redhat 8.7 安装oracle 11g-11.2.0.4 1、写在前面&#xff1a;这篇文章最后安装失败了。这是一次失败的尝试&#xff0c;仅做记录。结论是RHEL 8不支持Oracle 11g-11.2.0.4 安装&#xff0c;后续再研究怎么跑起来。1、数据库下载和安装文档1.1、查看oracle 11g 适合安装的linux…

阿里云版GPT官宣,我们问了它10个问题

4月7日&#xff0c;阿里云宣布自研大模型“通义千问”&#xff0c;目前已开始邀请用户测试体验。 阿里达摩院在NLP自然语言处理等前沿科研领域早已布局多年&#xff0c;并于2019年启动大模型研发&#xff0c;通义千问便是其最新成果&#xff0c;相当于阿里云版的“ChatGPT”。 …

让GPT成为护理专家 - 护士的工作如此简单

引子    书接上文《GPT接入企微应用 - 让工作快乐起来》&#xff0c;我把GPT接入了企微应用&#xff0c;不少同事都开始尝试起来了。有的浅尝辄止&#xff0c;有的刨根问底&#xff0c;五花八门&#xff0c;无所不有。这里摘抄几份&#xff1a; “帮我写一份表白信&#xff…

【Prompt】7 个向 chatGPT 高效提问的方法

欢迎关注【youcans的 AIGC 学习笔记】原创作品 【Prompt】7 个向 chatGPT 高效提问的方法 0. 向 chatGPT 高效提问的方法1. 提问方法&#xff1a;明确问题2. 提问方法&#xff1a;简洁清晰3. 提问方法&#xff1a;避免歧义4. 提问方法&#xff1a;提供上下文5. 提问方法&#x…

很不错的一篇文章,值得点赞收藏,带你全面了解MySQL性能调优、错误代码总结和全局参数配置(持续更新中ing)

前言 本文主要介绍当前MySQL性能优化原理实战&#xff0c;包括以下方面&#xff1a; 已更新文章目录MySQL遇到的的错误及解决方法全局参数文件配置详解。 后续希望大家提出宝贵的建议。喜欢的话点赞收藏关注走一波。如有错误的地方&#xff0c;请指出&#xff01;&#xff01;&…

C51 - 自写操作系统

最简OS 1> 版本1&#xff1a;任务建立与切换2> 版本2&#xff1a;定时器切换2.1> main.c2.2> task.c2.3> sleep.c 3> 版本3&#xff1a;加时间片轮转 在51单片机上&#xff0c;实现操作系统最简模型&#xff0c; 学习理解操作系统的基本概念&#xff1b; &am…

〖Python网络爬虫实战㉑〗- 数据存储之JSON操作

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…