高程 | 类与对象(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语言继承而来。
    • 默认访问控制属性也是公用的。
  • 但其全部数据成员共享一组内存单元,因此一组数据中,任何两个数据不会同时有效。
  • 限制
    • 联合体的各个对象成员(及其对象成员的对象成员以此类推),不能有自定义的构造函数,自定义的析构函数和重载的复制赋值运算符。
    • 联合体不能继承。
    • 不支持包含多态
  • 一般联合体用来存储一些公有的数据,而不为它定义函数成员;联合体也可以不声明名称,称为无名联合体,通常作为内嵌成员。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重复导航到当前位置引起的。Vue Router 提供了一种机制,阻止重复导航到相同的路由路径。

代码&#xff1a; <!-- 侧边栏 --><el-col :span"12" :style"{ width: 200px }"><el-menu default-active"first" class"el-menu-vertical-demo" select"handleMenuSelect"><el-menu-item index"…

linux内核原理--用户态线性地址空间,mmap,malloc,缺页异常

1.概述 前面我们介绍了内核态线性地址空间划分&#xff0c;及在内核态运行时&#xff0c;如何利用伙伴系统完成连续可用物理页框申请和释放。如何利用小块内存分配器实现高效的动态内存分配和释放。如何利用vmalloc&#xff0c;vfree完成线性地址连续但物理地址不连续的多个页框…

MATLAB|基于改进二进制粒子群算法的含需求响应机组组合问题研究(含文献和源码)

目录 主要内容 模型研究 1.改进二进制粒子群算法&#xff08;BPSO&#xff09; 2.模型分析 结果一览 下载链接 主要内容 该程序复现《A Modified Binary PSO to solve the Thermal Unit Commitment Problem》&#xff0c;主要做的是一个考虑需求响应的机组组合…

【AI视野·今日Robot 机器人论文速览 第七十九期】Thu, 18 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Thu, 18 Jan 2024 Totally 43 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers CognitiveDog: Large Multimodal Model Based System to Translate Vision and Language into Action of Quadruped Robot Aut…

探索微信小程序的奇妙世界:从入门到进阶

文章目录 一、什么是微信小程序1.1 简要介绍微信小程序的定义和特点1.2 解释小程序与传统应用程序的区别 二、小程序的基础知识2.1 微信小程序的架构2.2 微信小程序生命周期的理解2.3 探索小程序的目录结构和文件类型 三、小程序框架和组件3.1 深入了解小程序框架的核心概念和原…

ZISUOJ 2022年算法基础公选课练习四(Map)

说明&#xff1a; 博主为了提早预习数据结构和C的一些知识&#xff0c;自己琢磨外加查阅资料所写的代码&#xff0c;题目来源于22年初的学院老师组织的算法基础公选课的练习。我的代码甚至思路肯定存在许多不足和错误&#xff0c;欢迎大家批评指正。 题目列表&#xff1a; 问题…

Python Matplotlib 的学习笔记

Python Matplotlib 的学习笔记 0. Python Matplotlib 简介1. 为什么要用 Matplotlib&#xff1f;2. Matplotlib 基础类详解2-1. Line&#xff08;线&#xff09;2-2. Marker&#xff08;标记&#xff09;2-3. Text&#xff08;文本&#xff09;2-4. Legend&#xff08;图例&…

安卓价值1-如何在电脑上运行ADB

ADB&#xff08;Android Debug Bridge&#xff09;是Android平台的调试工具&#xff0c;它是一个命令行工具&#xff0c;用于与连接到计算机的Android设备进行通信和控制。ADB提供了一系列命令&#xff0c;允许开发人员执行各种操作&#xff0c;包括但不限于&#xff1a; 1. 安…

5种风格非常经典的免费wordpress主题

免费wordpress主题下载 高端大气上档次的wordpress主题&#xff0c;也可以是免费的&#xff0c;可以在线免费下载。 https://www.wpniu.com/themes/288.html wordpress免费主题 高端大气的wordpress免费主题&#xff0c;LOGO在顶部左侧&#xff0c;导航菜单在顶部右侧。 ht…

如何流畅进入Github

前言 以下软件是免费的&#xff0c;放心用 一、进入右边的下载链接https://steampp.net/ 二、点击下载 三、点击接受并下载 四、随便选一个下载链接进行下载 五、软件安装好打开后&#xff0c;找到Github 六、点击全部启用 七、再点击左上角的一键加速 八、这个时候你再进Git…

idea启动不起来

把进程杀了就好了 taskkill /pid 9744 -f

支付交易——跨境交易

摘要 老王兢兢业业经营生意多年&#xff0c;一步步从小杂货店做到现在&#xff0c;成立大型贸易公司。在做大做强的过程中&#xff0c;老王觉得国内市场已经饱和&#xff0c;竞争处处是红海。老王留意海外很多年了&#xff0c;决定走出去&#xff0c;转向海外:将国外的商品引进…

腾讯云4核8G服务器3年600元?

腾讯云4核8G服务器3年600元&#xff1f;目前的价格是轻量应用服务器4核8G12M带宽一年446元、646元15个月&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;标准型SA2服务器1444.8元一年&#xff0c;在txy.wiki可以查询详细…

坚持刷题|重建二叉树

文章目录 题目考察点代码实现实现总结扩展问题从前序和中序遍历中序列构建二叉树题目代码实现与后序实现的异同点 前序和后序可不可以唯一确定一棵二叉树呢&#xff1f; Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天刷…

机器学习12-基本感知器

感知器(Perceptron)是一种最简单的人工神经网络结构,由美国心理学家Frank Rosenblatt在1957年提出。它是一种单层的前馈神经网络,通常用于二分类问题。 基本感知器由多个输入节点、一个输出节点和一组权重参数组成。每个输入节点都与输出节点连接,并且具有一个对应的权重参…

尚硅谷最新Node.js 学习笔记(一)

目录 一、Nodejs入门 1.1、为什么要学习Nodejs&#xff1f; 1.2、Nodejs是什么&#xff1f; 1.3、Nodejs的作用 1.4、Nodejs安装 1.5、Nodejs初体验 1.6、编码注意事项 二、Buffer&#xff08;缓冲器&#xff09; 2.1、概念 2.2、特点 2.3、使用 创建Buffer Buffe…

【AI视野·今日CV 计算机视觉论文速览 第299期】Mon, 29 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 29 Jan 2024 Totally 55 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Annotated Hands for Generative Models Authors Yue Yang, Atith N Gandhi, Greg TurkGAN 和扩散模型等生成模型已经展示了…

如何用 ChatGPT 做项目管理?

ChatGPT 可以通过创建和维护跨团队项目协作计划&#xff0c;让员工更容易理解他们的角色和职责。 这个协作计划里面会包括每个团队或个人要执行的具体任务&#xff0c;每个任务最后期限和任何事情之 间的依赖关系。 该场景对应的关键词库:(24 个) 项目管理、项目协作计划、跨…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十)(2)(3)

实验十&#xff1a;非线性函数极值求解 练习二 1.求解极值问题: (1) s.t. function [c,ceq]fun(x) c(1)-(25-x(1)^2-x(2)^2); c(2)-(7-x(1)^2x(2)^2); ceq0;换一个窗口运行下面的程序&#xff1a; clc;clear; f(x)-2*x(1)-x(2); a[]; b[]; aeq[];beq[]; u[5;10]; l[0;0];…

AI换脸离线本地版-讲解2

嘿&#xff0c;准备好了吗&#xff1f;我来给你幽默地讲解下AI换脸&#xff01; 所谓AI换脸&#xff0c;就是让你变成“百变小萝莉”或者“花心大少爷”一样&#xff0c;只需一键操作&#xff0c;就能把你的脸魔法般地贴到别人脸上&#xff0c;就像是面部贴纸一样。你可以秒变…