高程 | 类与对象(c++)

文章目录

  • 📚面向对象程序设计的基本特点
    • 🐇抽象——概括问题,抽出公共性质并加以描述。
    • 🐇封装——将抽象所得数据和行为相结合,形成一个有机的整体,形成“类”。
    • 🐇继承——在原有类特性的基础上,进行更具体、更详细的说明。
    • 🐇多态——处理多种类型对象的能力。
  • 📚类与对象
    • 🐇类的定义
    • 🐇类成员的访问控制
    • 🐇类的对象:一个特定实体
    • 🐇类的成员函数
  • 📚构造函数和析构函数
    • 🐇构造函数——用于对象的初始化
    • 🐇析构函数——用于对象的清理
  • 📚类的组合
  • 📚结构体与联合体
    • 🐇结构体
    • 🐇联合体

📚面向对象程序设计的基本特点

🐇抽象——概括问题,抽出公共性质并加以描述。

  • 数据抽象:描述某类对象的属性或者状态,也就是此类对象区别于彼类对象的特征。类似于时钟的时、分、秒。
  • 行为抽象:某种对象的共同行为或功能特征。类似于时钟显示时间设置时间等的简单功能。

🐇封装——将抽象所得数据和行为相结合,形成一个有机的整体,形成“类”。

在这里插入图片描述

🐇继承——在原有类特性的基础上,进行更具体、更详细的说明。

🐇多态——处理多种类型对象的能力。

  • “打”可以“打篮球”“打排球”“打羽毛球”
  • 表面的多态性
    • 强制多态——将一种类型的数据转换成另一种类型的数据。
    • 重载多态——给同一个名字赋予不同的含义。
  • 真正的多态性
    • 包含多态——虚函数实现。
    • 类形参化多态——模块实现。

📚类与对象

🐇类的定义

  • 格式
    class 类名称
    {
    public://外部接口
    protected://保护性成员
    private://私有成员
    };
    
  • 数据成员:数据(时钟的时分秒)
  • 函数成员:行为(时钟显示时间)
  • 注意,在类中可以只声明函数的原型,函数的实现(即函数体)可以在类外定义。

🐇类成员的访问控制

在这里插入图片描述

  • 公有类型(public):公有类型成员定义了类的外部接口。在类外只能访问类的公有成员。
  • 私有类型(private):私有成员只能被本类的成员函数访问,来自类外部的任何访问都是非法的。
    • 一般情况下,一个类的数据成员都应该声明为私有成员,这样,内部数据结构就不会对类以外的其余部分造成影响,程序模块之间的相互作用就会被降低到最小。
    • 如果私有成员紧接着类名称,则关键字private可以省略。
  • 保护类型(protected):和私有成员的性质相似,其差别在于继承过程中对产生的新类的影响不同(后续补充
  • 规则
    • 在类的定义中,具有不同访问属性的成员,可以任意顺序出现。
    • 修饰访问属性的关键字也可以多次出现。
    • 但是一个成员只能具有一种访问属性。
    • 习惯:在书写时通常习惯将公有类型放在最前面,这样便于阅读。

🐇类的对象:一个特定实体

  • 整个公司的雇员看做一个类,那么每一个雇员就是该类的一个特定实体,也就是一个对象。
  • 对象的声明:类名 对象名
    • Clock myClock
    • 对象所占据的内存空间只是用于存放数据成员,函数成员不在每一个对象中存储副本,每个函数的代码在内存中只占据一部分空间。
  • 访问对象的成员:对象名.数据成员名
  • 调用函数成员:对象名.函数成员名(参数表)myClock.showTime()
  • 类和对象的关系就相当于基本数据类型与它的变量的关系,也就是一般与特殊的关系。

🐇类的成员函数

  • 在类的外部只能访问到类的公有成员;在类的成员函数中可以访问到类的全部成员。
  • 成员函数的实现:与普通函数不同的是,实现成员函数时要指明类的名称。
    在这里插入图片描述
  • 成员函数调用中的目的对象:使用myClock.showTime()调用showTime函数时,myClock就是这一调用过程的目的对象。
    在这里插入图片描述
  • 带默认形参值的成员函数
    • 类成员函数的默认值,一定要写在类定义中,而不能写在类定义之外的函数实现中。
    • 默认参数设置就是当这个函数没有给出实参,就会按照默认形参值调用。
    • 若给某一参数设置了默认值,那么在参数表中其后所有的参数都必须设置成默认值。
      在这里插入图片描述
  • 内联成员函数
    • 简单讲就是写在类定义里的函数。
    • 在编译时被插入到每一个调用它的地方,可以减少调用的开销,提高执行效率。但是却增加了编译后代码的长度,所以只有相对简单的成员函数才可以声明为内联函数。
    • 隐式声明
      在这里插入图片描述
    • 显示声明:类定义中不加入函数体,但在返回类型前加上inline,效果和隐式表达式完全相同的。
      在这里插入图片描述

📚构造函数和析构函数

🐇构造函数——用于对象的初始化

  • 构造函数的特点
    • 构造函数的作用就是在对象被创建时利用特定的值构造对象,将对象初始化于一个特定的状态。
    • 构造函数也是类的一个成员函数,除了具有一般成员函数的特征之外,构造函数:
      • 构造函数的函数名与类名相同。
      • 没有返回值。
      • 通常被声明为公有函数。
      • 构造函数在对象被创建时被自动调用。
    • 调用时无须提供参数的构造函数称为默认构造函数。如果类中没有写构造函数,那么编译器会自动生成一个隐含的默认构造函数。
  • 复制构造函数
    在这里插入图片描述
    • 它是一个特殊的构造函数,具有一般构造函数的所有特性。其形参是本类的对象的引用。

    • 其作用是使用一个已经存在的对象(由复制构造函数的参数指定),去初始化同类的一个新对象

    • 如果程序员没有写,那么系统就会在必要时自动生成一个隐含的复制构造函数。将初始值对象的每个数据成员的值都复制到新建立的对象中。

    • ⭐️普通构造函数在对象创建时被调用,而复制构造函数在以下三种情况下被调用:

      • 用类的一个对象去初始化该类的另一个对象
        在这里插入图片描述
      • 如果函数的形参是类的对象,调用函数时,进行形参和实参结合
        在这里插入图片描述
      • 函数的返回值是类的对象,函数执行完成返回调用时。如下:表面上函数g将a返回给了主函数,但是a是g()的局部对象,离开建立它的函数g以后就消亡了,所以需要复制构造函数。

      在这里插入图片描述

🐇析构函数——用于对象的清理

在这里插入图片描述

  • 析构函数是在对象的生存期快结束时被自动调用的。
  • 与构造函数一样,析构函数通常也是类的一个公有函数成员,它的名称是由类名前面加~构成的,没有返回值,不接收任何参数,但可以是虚函数。(虚函数后面补充)。
  • 不进行显式说明,系统也会生成一个函数体为空的隐含析构函数,而且它未必不做任何事(后续介绍)。
  • 一般来讲,如果希望程序在对象被删除之前的时刻自动完成某些事情,就可以把它们写到析构函数中

📚类的组合

  • 类的组合就是一个类内嵌其他类的对象作为成员,它们之间的关系是一种包含与被包含的关系。
  • 当创建类的对象时,如果这个类具有内嵌对象成员,那么各个内嵌对象首先将被自动创建。
  • 在创建对象时既要对本类的基本类型数据成员进行初始化,又要对内嵌对象成员进行初始化。
  • 一般形式为:
    在这里插入图片描述
  • ⭐️组合类对象的构造函数的调用顺序
    • (1)调用内嵌对象的构造函数,调用顺序按照内嵌对象在组合类的定义中出现的次序。注意,内嵌对象在构造函数的初始化列表中出现的顺序与内嵌对象构造函数的调用顺序无关。
    • (2)执行本类构造函数的函数体。
      在这里插入图片描述
  • ⭐️析构函数则正好相反
    在这里插入图片描述
  • 如果要为组合类编写复制构造函数,则需要为内嵌成员对象的复制构造函数传递参数。
    在这里插入图片描述

📚结构体与联合体

🐇结构体

  • 它和类的功能完全相同,但引入结构体可保持和C程序的兼容性。
    struct 结构体名称
    {//公有成员
    protected://保护性成员
    private://私有成员
    };
    
  • 结构体是一种特殊形态的类,可以:
    • 有自己的数据成员和函数成员。
    • 有自己的构造函数和析构函数。
    • 控制访问权限。
    • 支持包含多态等。
  • 区别在于结构体和类有不同的默认访问控制属性。
    • 在类中,对于未指定访问控制属性的成员,其访问控制属性为私有类型;
    • 在结构体中,没指定的为公有类型。

🐇联合体

  • 基本结构
    union 联合体名称
    {//公有成员
    protected://保护性成员
    private://私有成员
    };
    
  • 联合体也是一种特殊形态的类,可以:
    • 有自己的数据成员和函数成员。
    • 有自己的构造函数和析构函数。
    • 控制访问权限。
    • 由C语言继承而来。
    • 默认访问控制属性也是公用的。
  • 但其全部数据成员共享一组内存单元,因此一组数据中,任何两个数据不会同时有效。
  • 限制
    • 联合体的各个对象成员(及其对象成员的对象成员以此类推),不能有自定义的构造函数,自定义的析构函数和重载的复制赋值运算符。
    • 联合体不能继承。
    • 不支持包含多态
  • 一般联合体用来存储一些公有的数据,而不为它定义函数成员;联合体也可以不声明名称,称为无名联合体,通常作为内嵌成员。

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

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

相关文章

Python爬虫学习

1.1搭建爬虫程序开发环境 爬取未来七天天气预报 from bs4 import BeautifulSoup from bs4 import UnicodeDammit import urllib.request url"http://www.weather.com.cn/weather/101120901.shtml" try:headers{"User-Agent":"Mozilla/5.0 (Windows …

C/C++进制转换

十进制转化为二进制 进制转化#include <iostream> using namespace std;void change(int); int main() {int num;cout << "请输入一个十进制数: ";cin >> num;cout << "转化后的二进制数为: ";change(num);return 0; } void chan…

51_蓝桥杯_蜂鸣器与继电器

一 电路 二 蜂鸣器与继电器工作原理 2.1蜂鸣器与继电器 2.2 十六进制与二进制 二进制 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 十六进制 0 1 2 3 4 5 6 7 8 9 A B C D E F 2.3非门 二 代码 …

straight insertion sorting

直接插入排序算法&#xff1a;第一个元素作为有序序列&#xff0c;从第二个元素开始&#xff0c;在其之前的序列里找到对应的位置&#xff0c;然后插入。 下面用了tmp作为哨兵。 #include <iostream> using namespace std;const int Nn 100010; int a[Nn];int main() …

[嵌入式系统-26]:RT-Thread -13- 内核组件编程接口 - 文件系统

目录 一、RT-Thread文件系统 1.1 概述 1.2 如何配置文件系统 1.3 支持哪些文件系统 1.4 不同文件系统的比较 二、文件系统编程接口 2.1 概述 2.2 两种文件系统接口的比较 三、POSIX 文件操作函数 3.1 概述 3.2 代码实例 一、RT-Thread文件系统 1.1 概述 RT-Thread…

Java Lambda表达式:简化编程,提高效率

Java Lambda表达式&#xff1a;简化编程&#xff0c;提高效率 1. 使用Lambda表达式进行集合遍历1.1 未使用Lambda表达式&#xff1a;1.2 使用Lambda表达式&#xff1a; 2. 使用Lambda表达式进行排序2.1 未使用Lambda表达式&#xff1a;2.2 使用Lambda表达式&#xff1a; 3. 使用…

精通C语言:打造高效便捷的通讯录管理系统

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C语言项目 贝蒂的主页&#xff1a;Betty‘s blog 引言 在我们大致学习完C语言之后&#xff0c;我们就可以利用目前所学的知识去…

HCIA-HarmonyOS设备开发认证V2.0-内核扩展组件

目录 一、CPU 占用率1.1、CPU 占用率基本概念1.2、CPU 占用率运行机制1.3、CPU 占用率开发流程 二、动态加载2.1、 动态加载基本概念2.2、动态加载运行机制 坚持就有收获 一、CPU 占用率 1.1、CPU 占用率基本概念 CPU&#xff08;中央处理器&#xff0c;Central Processing U…

第三节作业:基于 InternLM 和 LangChain 搭建你的知识库

参考文档&#xff1a;https://github.com/InternLM/tutorial/tree/main/langchain 基础作业&#xff1a;复现课程知识库助手搭建过程 (截图) 1.环境配置 2.知识库搭建 &#xff08;1&#xff09;数据收集 收集由上海人工智能实验室开源的一系列大模型工具开源仓库作为语料库来…

单html页面使用Vue3和Element-Plus

快速入门&#xff08;直接整案例&#xff0c;看显示效果&#xff09; 使用CDN方式引入Vue3使用CDN方式引入Element-Plus的样式文件和组件库 案例1&#xff08;按钮&#xff0c;表格&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta …

什么是死锁以及如何避免死锁?

死锁是多线程或多进程编程中的一个常见问题&#xff0c;发生于两个或多个进程或线程在执行过程中&#xff0c;因为争夺资源而相互等待对方释放资源&#xff0c;导致它们之间形成了一个无尽的循环等待&#xff0c;从而无法继续执行的情况。在死锁状态下&#xff0c;所有相关的进…

人工智能时代

一、人工智能发展历史:从概念到现实 人工智能(Artificial Intelligence,简称AI)是计算机科学领域中一门旨在构建能够执行人类智能任务的系统的分支。其发展历程充满曲折,从概念的提出到如今的广泛应用,是技术、理论和实践相互交织的产物。 1. 起源(20世纪中期) 人工智…

对称密钥密码体制、公钥密码体制

1 对称密钥密码体制 加密密钥与解密密钥都使用相同密钥的密码体制。 数据加密标准 DES DES 属于对称密钥密码体制&#xff0c;是一种分组密码。 在加密前&#xff0c;先对整个明文进行分组。每一个组长为 64 位。 然后对每一个 64 位 二进制数据进行加密处理&#xff0c;…

预处理和预编译、预编译头文件stdafx.h和pch.h

预处理和预编译 预处理&#xff1a;发生在编译前&#xff0c;做些代码文本的替换工作。 宏定义&#xff1a;#define宏定义的替换。文件包含&#xff1a;#include指明的源程序文件嵌入到当前源文件的指令位置处。条件编译&#xff1a;根据标识符来判断程序段是否需要编译这段代…

云计算基础-华为存储实验

存储配置流程 创建硬盘域&#xff08;CK&#xff0c;包括热备CK&#xff09;创建存储池&#xff08;CKG、Extent&#xff09;创建LUN、LUN组、将LUN加入LUN组创建主机、主机组、将主机加入主机组创建映射视图&#xff08;LUN组和主机组的映射&#xff09; 1. 创建CK 创建硬盘…

MyBatis sql拦截器实现一个自动根据租户进行分表的方案

需求描述&#xff1a; 在一个多租户系统中&#xff0c;通过 MyBatis 实现动态数据表分离。具体来说&#xff0c;您希望通过 MyBatis 拦截器在执行 SQL 时自动将表名根据当前租户 ID (tenantId) 进行修改。这样&#xff0c;每个租户的数据就可以存储在专属于它们的表中&#xf…

【数据结构】二叉查找树和平衡二叉树,以及二者的区别

目录 1、二叉查找树 1.1、定义 1.2、查找二叉树的优点 1.2、查找二叉树的弊端 2、平衡二叉树 2.1、定义 2.2、 实现树结构平衡的方法&#xff08;旋转机制&#xff09; 2.2.1、左旋 2.2.2、右旋 3、总结 1、二叉查找树 二叉查找树又名二叉排序树&#xff0c;亦称二叉搜…

究极小白如何自己搭建一个自动发卡网站-独角数卡

本人从来没接触过建站&#xff0c;我之前都是在TB上花90叫别人给我搭建的网站&#xff0c;前几天这个TB店倒闭跑路了&#xff0c;而我的发卡网也打不开了&#xff0c;没办法&#xff0c;逼上梁山&#xff0c;自己捣鼓出来了&#xff01;下面是2023/4/2自己建好的&#xff01; …

【C++】STL简单介绍(了解入门!!!!)

文章目录 前言1. 什么是STL&#xff1f;2. STL的版本3. STL的六大组件4. STL的重要性5. 如何学习STL6. STL的缺陷总结 前言 C Standard Template Library&#xff08;STL&#xff09;是C编程语言的重要组成部分&#xff0c;它提供了丰富的数据结构和算法&#xff0c;为C程序员…

租用一个服务器需要多少钱?2024阿里云新版报价

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…