C++初阶:类和对象(上)

1. 类的定义

1.1 类的定义格式

  • class为定义类的关键字,Stack为类的名字,{ } 中为类的主体,注意类定义结束后的分号不能省略。类体中的内容为类的成员:类中的变量称为类的属性成员变量;类中的函数称为类的方法成员函数
  • 为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或后面加 _ 或者 m 开头,注意C++中这个并不是强制的,只是一些惯例,具体看公司的要求。
  • C++中 struct 也可以定义类,C++中兼容C中 struct 的用法,同时 struct 升级成了类,明显的变化是 struct 中可以定义函数,一般情况下,我们还是推荐使用 class 定义类。
  • 定义在类里面的成员函数默认为 inline

C++中 struct 不需要用 typedef ,后面的类名就可以代表类型;

1.2 访问限定符

  • C++ 中一种实现封装的方式,用类将对象的属性方法结合在一块,让对象更加完善,通过访问权限,选择性的将其接口提供给外部的用户使用。
  • public(公开的)修饰的成员在类外可以被直接访问;protected(受保护的) 和 private(私有的)修饰的成员在类外不能被直接访问,protected 和 private 是一样的,后继章节才会体现出他们的区别。
  • 访问权限作用域从该访问限定符出现的位置开始直到出现下一个访问限定符为止,如果后面没有出现访问限定符,作用域就到 } 即类结束为止。
  • class定义成员没有被访问限定符修饰时默认为 private 修饰,struct 默认为 public 。
  • 一般成员变量都会被限制为private / protected ,需要给别人使用的函数默认为 public

1.3 类域

  • 类定义了一个新的作用域,类的所有成员都在类的作用域中,在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
  • 类域影响的是编译的查找规则,下面程序中 Init 如果不指定类域Stack,那么编译器就会把 Init当成全局函数,那么编译时,找不到 array 等成员的声明或者定义在哪里,就会报错。指定类域 Stack就是知道 Init 是成员函数,当前域找不到 array 等成员就会去类域中查找。

2. 实例化

2.1 实例化概念

  • 类型在物理内存中创建对象的过程,称为实例化出对象。
  • 类的对象是一种抽象描述,是一个模型一样的东西,限定了类有哪些成员变量,这些成员变量只是声明,并没有创造出空间,用类实例化出对象时,才会分配空间。
  • 一个类能实例化出多个对象,实例化出的对象,占用实际的物理空间,储存类成员变量。打个比方:类实例化出的对象就像现实中使用建筑设计图建造出房子,类就像设计图纸,设计图规划了有多少个房间,房间大小功能等,但是并没有实体的建筑存在,也不能住人,用设计图修建出的房子,房子才能住人。同样,类就像设计图一样,不能存储数据,实例化出的对象分配物理内存存储数据

以下是代码示例:

2.2 对象大小

类实例化出的每个对象,都有独立的数据空间,对象中肯定要包含成员变量,但是并不包含成员函数。函数被编译后是一串指令,对象中无法储存,这些指令存储在单独的区域(代码段),如果对象中非要储存的话,只能是成员函数的指针,但是并没有储存的必要。因为,Date 实例化出的对象 date1 和 date2 ,date1 和 date2 都有各自独立的成员变量,但是成员函数指针却是相同的,储存在对象中就浪费了,几个还好,如果实例化出一千个,一万个呢?就会造成指针重复储存。额外说一下,这里的成员函数指针并不需要存储,函数指针是一个地址,调用函数被编译成汇编指令,【call地址】,在编译器链接的时候,就要找到函数的地址,不是在运行的时候找,只有动态多态是在运行时找,需要存储函数地址(以后讲)。

上面我们分析了对象中只存储成员变量,C++规定类实例化对象也要符合内存对齐规则(之前有讲)

需要注意的是:如果一个类中并没有成员变量,那么这个类创建的对象大小是1个字节,为什么没有成员变量还要给一个字节呢?因为如果一个字节都不给,怎么表示对象存在过呢?要知道实例化的对象要占据独立的内存空间的。所以给一个字节,纯粹是为了占位标识对象的存在。

3. this 指针

  • Date 类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当 d1 调用 Init 和Print 函数时,该函数是如何知道该访问的是的 d1 对象还是 d2 对象呢? C++ 这里给了一个隐含的this 指针解决了这个问题。
  • 编译器编译后,类的成员函数默认都会在形参第一个位置,增加一个当前类型的指针,叫做 this指针。比如 Date 类的 Inti 的真实原型为,void Init (Date* const this, int year, int month, int day) 
  • 类的成员函数中访问成员变量,本质都是通过 this 指针访问的,如 Init 函数中给 _year 赋值,this->_year = year;
  • C++ 规定不能实参和形参的位置显示的写 this 指针(编译时编译器会处理),但是可以在函数体内显示使用 this 指针。

制作不易,谢谢大家的点赞关注支持!!!

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

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

相关文章

ctfshow DSBCTF web部分wp

ctfshow 单身杯 web部分wp web 签到好玩的PHP 源码&#xff1a; <?php error_reporting(0); highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public function __destruct() {$this->d (string)$this->d;$this…

【分布式】万字图文解析——深入七大分布式事务解决方案

分布式事务 分布式事务是指跨多个独立服务或系统的事务管理&#xff0c;以确保这些服务中的数据变更要么全部成功&#xff0c;要么全部回滚&#xff0c;从而保证数据的一致性。在微服务架构和分布式系统中&#xff0c;由于业务逻辑往往会跨多个服务&#xff0c;传统的单体事务…

边缘计算在智能物流中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 边缘计算在智能物流中的应用 引言 边缘计算概述 定义与原理 发展历程 …

Spring Boot框架:电商开发的新趋势

5 系统实现 系统实现部分就是将系统分析&#xff0c;系统设计部分的内容通过编码进行功能实现&#xff0c;以一个实际应用系统的形式展示系统分析与系统设计的结果。前面提到的系统分析&#xff0c;系统设计最主要还是进行功能&#xff0c;系统操作逻辑的设计&#xff0c;也包括…

本地源配置 以及ssh 和 nfs

安装软件的三种方式 apt 仓库 在/etc/apt/sources.list文件下 在线源 离线包 修改离线包 挂载并更新 ssh远程管理 sshd的配置文件 服务器命令行的远程登录方式 远程复制 先在第一台主机上创建文件 使用scp命令复制 sftp ssh的密钥登录 创建rsa密钥 将密钥文件传给另一台主机…

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

【MMIN】缺失模态想象网络用于不确定缺失模态的情绪识别

代码地址&#xff1a;https://github.com/AIM3RUC/MMIN abstract&#xff1a; 在以往的研究中&#xff0c;多模态融合已被证明可以提高情绪识别的性能。然而&#xff0c;在实际应用中&#xff0c;我们经常会遇到模态丢失的问题&#xff0c;而哪些模态会丢失是不确定的。这使得…

图像处理实验四(Adaptive Filter)

一、Adaptive Filter简介 自适应滤波器&#xff08;Adaptive Filter&#xff09;是一种能够根据输入信号的统计特性自动调整自身参数以达到最佳滤波效果的滤波器。它广泛应用于信号处理领域&#xff0c;如信道均衡、系统识别、声学回波抵消、生物医学、雷达、波束形成等模块。 …

深入理解AIGC背后的核心算法:GAN、Transformer与Diffusion Models

深入理解AIGC背后的核心算法&#xff1a;GAN、Transformer与Diffusion Models 前言 随着人工智能技术的发展&#xff0c;AIGC&#xff08;AI Generated Content&#xff0c;人工智能生成内容&#xff09;已经不再是科幻电影中的幻想&#xff0c;而成为了现实生活中的一种新兴力…

【STM32】基于SPI协议读写SD,详解!

文章目录 0 前言1 SD卡的种类和简介1.1 SD卡的种类1.2 SD卡的整体结构1.3 SD卡运行机制——指令和响应2 SD卡的通信总线2.1 SDIO2.2 SPI3 硬件连接4 代码实践【重点】4.1 HAL库移植4.2 标准库移植4.3 遇到的问题和解决方案5 扩展阅读0 前言 因为项目需要,使用stm32读写sd卡,这…

Three.js 纹理贴图

1. 纹理贴图 在Three.js中&#xff0c;纹理贴图是一种将二维图像贴到三维物体表面的技术&#xff0c;以增强物体的视觉表现。纹理贴图可以使物体表面更加真实、细腻&#xff0c;为场景增色不少。 在Three.js中&#xff0c;纹理贴图的加载主要通过THREE.TextureLoader类实现。…

ArcGIS Pro属性表乱码与字段名3个汉字解决方案大总结

01 背景 我们之前在使用ArcGIS出现导出Excel中文乱码及shp添加字段3个字被截断的情况&#xff0c;我们有以下应对策略&#xff1a; 推荐阅读&#xff1a;ArcGIS导出Excel中文乱码及shp添加字段3个字被截断&#xff1f; 那如果我们使用ArGIS Pro出现上述问题&#xff0c;该如何…

图论-代码随想录刷题记录[JAVA]

文章目录 前言Floyd 算法dijkstra&#xff08;朴素版&#xff09; 前言 新手小白记录第一次刷代码随想录 1.自用 抽取精简的解题思路 方便复盘 2.代码尽量多加注释 3.记录踩坑 4.边刷边记录&#xff0c;更有成就感&#xff01; 5.解题思路绝大部分来自代码随想录 Floyd 算法 【…

anzocapital 昂首资本:外汇机器人趋势判断秘籍

再盲目交易而不借助像 anzocapital 昂首资本所了解的外汇机器人趋势判断方法&#xff0c;投资者在外汇市场将面临亏损的风险&#xff0c;anzocapital 昂首资本深知交易策略的重要性&#xff0c;就像外汇机器人确定趋势方向的方法&#xff0c;对投资者有着非凡的意义。 在外汇交…

【划分型DP-约束划分个数】【hard】力扣410. 分割数组的最大值

给定一个非负整数数组 nums 和一个整数 k &#xff0c;你需要将这个数组分成 k 个非空的连续子数组&#xff0c;使得这 k 个子数组各自和的最大值 最小。 返回分割后最小的和的最大值。 子数组 是数组中连续的部份。 示例 1&#xff1a; 输入&#xff1a;nums [7,2,5,10,8]…

python高级之面向对象编程

一、面向过程与面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 1、面向过程pop&#xff1a; 举例&#xff1a;孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃饭 8. 妈妈给孩子送学校…

shell脚本(1)

免责声明 学习视频来自B 站up主泷羽sec&#xff0c;如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 Shell脚本 建立一个sh脚本…

《DiffusionDet: Diffusion Model for Object Detection》ICCV2023

摘要 本文提出了一种新的框架DiffusionDet&#xff0c;它将目标检测任务表述为从带噪声的边界框到目标边界框的去噪扩散过程&#xff08;如图一所示&#xff09;。在训练阶段&#xff0c;目标边界框逐渐扩散到随机分布&#xff0c;模型学习逆转这一加噪过程。在推理阶段&#…

ISAAC SIM踩坑记录--ROS2相机影像发布

其实这个例子官方和大佬NVIDIA Omniverse和Isaac Sim笔记5&#xff1a;Isaac Sim的ROS接口与相机影像、位姿真值发布/保存都已经有详细介绍了&#xff0c;但是都是基于ROS的&#xff0c;现在最新的已经是ROS2&#xff0c;这里把不同的地方简单记录一下。 搭建一个简单的场景&a…

outlook邮箱关闭垃圾邮件——PowerAutomate自动化任务

微软邮箱反垃圾已经很强大了非常敏感&#xff0c;自家的域名的邮件都能给扔到垃圾邮箱里&#xff0c;但还是在本地增加了一层垃圾邮箱功能&#xff0c;然后垃圾邮箱并没有提示&#xff0c;导致错过很多通知&#xff0c;本身并没有提供关闭的功能&#xff0c;但微软有个Microsof…