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.rhkb.cn/news/470879.html

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

相关文章

linux设置主机名

1、查看主机名 hostname默认: localhost.localdomain 2、更改主机名 编辑/etc/hostname,修改成自己需要的主机名,如self-name 3、设置hosts 编辑/etc/hosts,将修改的主机名增加一个映射 127.0.0.1 localhost localhost.lo…

MybatisPlus入门(十)MybatisPlus-逻辑删除和多记录操作

一、Mybatis-Plus 多记录操作 按照主键删除多条记录 List<Long> ids Arrays.asList(new Long[]{2,3}) userDao.deleteBatchIds(ids); 示例代码如下: Testvoid testDelete(){//删除指定多条数据List<Long> list new ArrayList<>();list.add(14025513424818…

解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url

解决Anaconda出现CondaHTTPError: HTTP 000 CONNECTION FAILED for url 第一类情况 在anaconda创建新环境时&#xff0c;使用如下代码 conda create -n charts python3.7 错误原因&#xff1a; 默认镜像源访问速度过慢&#xff0c;会导致超时从而导致更新和下载失败。 解决方…

Python数据类型(一):bool布尔类型

Python数据类型系列目录 Python数据类型&#xff08;一&#xff09;&#xff1a;bool布尔类型 文章目录 一、创建bool值二、逻辑运算符三、布尔类型与其他类型的转换四、条件判断五、循环控制六、相关问答 在Python编程语言中&#xff0c;布尔类型是一种基本的数据类型&#x…

C++面试基础知识:排序算法 C++实现

上周实习面试&#xff0c;手撕代码快排没写出来&#xff0c;非常丢人&#xff0c;把面试官都给逗笑了。 基础不牢&#xff0c;地动山摇&#xff0c;基础的算法还是要牢记于心的。 插入排序 分为有序区和无序区&#xff0c;每次从无序区中选出一个&#xff0c;放到有序区域中。…

LabVIEW开发相机与显微镜自动对焦功能

自动对焦是显微成像系统中的关键功能&#xff0c;通常由显微镜的电动调焦模块或特定的镜头系统提供&#xff0c;而工业相机则主要用于高分辨率图像的采集&#xff0c;不具备独立的自动对焦功能。以下是自动对焦的工作原理、实现方式及实际应用案例。 1. 自动对焦的工作原理 &a…

一文简单了解Android中的input流程

在 Android 中&#xff0c;输入事件&#xff08;例如触摸、按键&#xff09;从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次&#xff0c;包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程&#xff0c;并结合代码逐步了解…

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送

在C#中&#xff0c;SendMessage方法是一个强大的工具&#xff0c;它允许我们与Windows API交互&#xff0c;模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数&#xff0c;它用…

爱普生SG-8200CJ可编程晶振在通信设备中的应用

在现代通信技术中&#xff0c;时钟源是确保系统运行稳定性的核心组件之一。随着数据传输速度的提高和系统复杂性的增加&#xff0c;通信设备对时钟的精度、稳定性和可靠性提出了更高的要求。爱普生SG-8200CJ可编程晶振&#xff0c;凭借其优异的性能特性&#xff0c;在通信设备领…

ssm100医学生在线学习交流平台+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;医学生在线学习交流平台当然也不能排除在外&#xff0c;随着医学生在线学习交流平台的不断成熟&#xff0c;它彻底改变了过去传统的管理方式&a…

【数据结构】交换排序——冒泡排序 和 快速排序

交换排序——冒泡排序 和 快速排序 一、冒泡排序二、快速排序2.1 不同版本的快速排序<1>霍尔版本**1> 开闭区间****2> key 的取值****3> 单次循环的筛选条件****4> 为什么要先右边后左边****5> 递归停止条件** <2>挖坑版本<3>前后指针版本 2.…

C++模板特化实战:在使用开源库boost::geometry::index::rtree时,用特化来让其支持自己的数据类型

用自己定义的数据结构作为rtree的key。 // rTree的key struct OverlapKey {using BDPoint boost::geometry::model::point<double, 3, boost::geometry::cs::cartesian>; //双精度的点using MyRTree boost::geometry::index::rtree<OverlapKey, boost::geometry::in…

Redis - 集群(Cluster)

一、基本概念 上述的哨兵模式,提⾼了系统的可⽤性.但是真正⽤来存储数据的还是master和slave节点.所有的数 据都需要存储在单个master和slave节点中. 如果数据量很⼤,接近超出了master/slave所在机器的物理内存,就可能出现严重问题了. 如何获取更⼤的空间?加机器即可!所谓&q…

【专题】计算机网络之网络层

1. 网络层的几个重要概念 1.1 网络层提供的两种服务 (1) 让网络负责可靠交付 计算机网络模仿电信网络&#xff0c;使用面向连接的通信方式。 通信之前先建立虚电路 VC (Virtual Circuit) (即连接)&#xff0c;以保证双方通信所需的一切网络资源。 如果再使用可靠传输的网络…

Jmeter性能测试 -3数据驱动实战

软件测试资料领取&#xff1a;[内部资源] 想拿年薪40W的软件测试人员&#xff0c;这份资料必须领取~ 软件测试面试刷题工具&#xff1a;软件测试面试刷题【800道面试题答案免费刷】 什么是数据驱动&#xff1f; 从数据文件中读取测试数据&#xff0c;驱动测试过程的一种测试…

INQUIRE:一个包含五百万张自然世界图像,涵盖10,000个不同物种的专为专家级文本到图像检索任务设计的新型基准数据集。

2024-11-05 &#xff0c;由麻省理工学院、伦敦大学学院等联合创建了Inquire数据集&#xff0c;这是一个包含五百万自然世界图像的文本到图像检索基准测试&#xff0c;目的是挑战多模态视觉-语言模型在专家级查询上的表现。这个数据集的创建&#xff0c;不仅填补了现有数据集在专…

DevOps工程技术价值流:加速业务价值流的落地实践与深度赋能

DevOps的兴起&#xff0c;得益于敏捷软件开发的普及与IT基础设施代码化管理的革新。敏捷宣言虽已解决了研发流程中的诸多挑战&#xff0c;但代码开发仅是漫长价值链的一环&#xff0c;开发前后的诸多问题仍亟待解决。与此同时&#xff0c;虚拟化和云计算技术的飞跃&#xff0c;…

4.4 软件设计:UML顺序图

UML顺序图 1、 UML2、 UML顺序图2.1 顺序图组成对象生命线消息 2.2 顺序图和用例登录用例 2.3 顺序图建模顺序图建模参考策略建立顺序图的步骤建立顺序图的示例 3、面对对象的设计原则3.1 特点3.2 层次3.3 注意点类设计需要强内聚&#xff0c;弱耦合可重用性框架 1、 UML 统一…

除了 Mock.js,前端还有更方便的 Mock 数据工具吗?

在前端开发中&#xff0c;模拟数据&#xff08;Mock Data&#xff09;是不可或缺的一部分&#xff0c;它能够帮助开发者在后端接口未完成前进行界面和逻辑的测试。而 Mock.js 是一个广泛使用的库&#xff0c;它通过简洁的语法和强大的功能&#xff0c;让前端开发者可以轻松地创…

继承和多态(上)

目录 一.继承 1.何为继承 2.继承的语法 3.子类访问父类 (1)子类访问父类的成员变量 (2)子类访问的父类方法 二.super关键字 1.super用于调用父类的构造方法 2.super用于调用父类的实例方法 3.super用于访问父类的实例变量 三.子父类构造方法 和代码块的执行优先顺序…