C++初阶——类和对象(一)

C++初阶——类和对象(一)

一、面向过程和面向对象

1.面向过程

面向过程的程序设计(Procedure-Oriented Programming),简称POP,是一种是以程序执行流程为核心的编程范式。它是先分析出解决问题所需要的的步骤,然后用函数把这些步骤一步步地实现,在使用的时候依次调用就可以了。

2.面向对象

面向对象的程序设计(Object-Oriented Programming),简称OOP,关注的不再是完成一个任务的过程,而是完成这个任务涉及到的对象。比如,在点外卖这一过程中,就涉及到用户,商家和骑手这几个对象。专业一点来讲,面向对象编程(OOP)以现实世界实体映射为核心,将问题域抽象为对象的集合,每个对象包含数据和方法(函数)的封装体。其哲学源于亚里士多德的“实体-属性”论,通过类(Class)定义对象的蓝图设计图纸),实现“分类-实例化”的认知建模。
面向对象有三大特性:封装、继承、多态

(1)封装
  • 数据和操作数据的方法(函数)进行有机结合,隐藏对象的属性和实现细节,仅对外公开接口来和对象进行交互。
  • C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使在类(class)中,通过访问修饰符(private/public)控制数据暴露程度,提升隐私性和安全性。
  • 2024年波音787航电系统升级时,因多个函数共享navigation_state全局变量,导致姿态控制模块与通信模块数据冲突,引发短暂系统宕机;防止外部误操作:通过private/public修饰符,限制数据的直接访问,可以让银行账户的balance(余额)字段仅允许通过withdraw()方法修改;防御性编程:2024年特斯拉自动驾驶系统升级后,传感器数据的封装层拦截了12%的非法访问请求,避免了系统崩溃。
  • 在C++初阶的类和对象内容,我们主要就是围绕封装这一特性展开
(2)继承
  • 继承(Inheritance)是面向对象编程中实现代码复用和层次抽象的核心机制,允许子类继承父类的属性和方法。这里不过多介绍,在C++进阶的内容,我们会详细讲解。
(3)多态
  • 多态(Polymorphism)是面向对象编程中同一接口在不同上下文中表现不同行为的能力,其核心在于“一个接口,多种实现”。这也是非常重要的内容,同样,在C++进阶中,我们会详细讲解。

二、类的介绍

类定义了一个新的作用域,类的所有成员都在类的作用域中。通过class关键字将数据与操作(成员函数)绑定。在类体外定义成员时,需要使用 :: 域作用限定符指明成员属于哪个类域,比如在类里面声明一个成员函数,在类外面定义时,就要使用 ::
我们先来简单的感受一下:

class Stack
{
public:// 成员函数void Init(int defaultCapacity = 4)//提供一个缺省参数,如果没有传参,就使用这里的值{a = (int*)malloc(sizeof(int) * capacity); //基本操作,检查动态内存开辟是否成功if (nullptr == a){perror("malloc fail");return;}capacity = defaultCapacity;top = -1;}void Push(int x){//...a[++top] = x;}void Destroy(){free(a);a = nullptr;top = capacity;}	
private:// 成员变量int* a;int top;int capacity;
};
int main()
{return 0;
}

在这里,我们主要是熟悉一下类的使用,没有详细实现具体的内容,关于栈,在数据结构专栏中已经进行了详细的讲解。在一个类中,重要的是访问限定符——publicprivate和protect,我们详细介绍一下:

  • public修饰的成员在类外可以直接被访问
  • protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
  • 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
  • 如果后面没有访问限定符,作用域就到 } 即类结束。
  • class的默认访问权限为private,struct为public(因为struct要兼容C)
    如图所示:
    示例1
    struct(结构体)在C语言中,里面是不可以定义函数的,但是在C++中,struct升级成了类,可以定义成员函数,但是struct里面的内容默认是公开的(public),外界可以随意访问,也是兼容了C语言结构体的性质,但class就不一样了:
    示例2

    class默认是私有,需要加上public声明才能被访问,如图:
    示例4
    示例5
    允许外界访问的是函数func,至于成员变量a、b,则是不想公开的。
  • 在这里,我们也可以在类里面给出函数的声明,在类的外面给出函数的定义:
    示例6
    这里需要指定函数Print是属于A这个类域。
    我们来看下面一段代码:
    示例7
    这里的year=year含义就不清楚了,到底是形参自己赋值给自己还是将形参赋值给成员变量?因此我们应当这样写:
    示例8

三、类的实例化

类定义仅仅是逻辑的蓝图,就像是一个房间的设计图纸,并不能真正的住进去,因此,我们需要对类进行实例化才会创建出具体的对象,分配内存空间,简而言之,用类创建对象的过程,称为类的实例化。同一个类可以实例化出多个不同的对象,比如:在特斯拉工厂的Robot类实例化后,每个机器人拥有了独立的关节状态;银行系统的Account类只有实例化后,才会绑定具体账户持有者。我们来举个例子:

class Stack
{
public:// 成员函数void Init(int defaultCapacity = 4){a = (int*)malloc(sizeof(int) * defaultCapacity);if (nullptr == a){perror("malloc fail");return;}capacity = defaultCapacity;top = -1;}void Push(int x){a[++top] = x;}void Destroy(){free(a);a = nullptr;top = capacity;}
private:// 成员变量int* a;int top;int capacity;
};int main()
{Stack st1;st1.Init(20);st1.Init();st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);st1.Destroy();return 0;
}

这里还是一个简单的栈,首先,我们实例化了一个栈st1,现在st1不是一个图纸,而是有具体内存空间的对象,我们可以对一个实例化出来的对象进行有实际意义的操作,比如初始化开空间(这里开的20,如果没有提供开多少的参数,也没关系,因为这里使用了缺省参数int defaultCapacity = 4),元素入栈,栈的销毁等等,如果不进行实例化,是没有任何意义的,比如:
示例9
示例10
直接对着图纸插入数据,显然是没有任何意义的。
那么,我们刚才定义函数不是用了::吗?
示例11
注意,这里是定义,其实还是在画图纸,并不是真正的使用。在类体外定义成员时,需要使用 :: 域作用限定符指明成员属于哪个类域,比如在类里面声明一个成员函数,在类外面定义时,就要使用 ::
还有一个问题,在链表中,我们特意强调了结构体是自定义类型,struct的使用是要带上它的名字的,比如链表的结构体指针struct ListNode*就是一个典型的例子,在C++中还需要这样吗?
答案是:不需要!
因为C++已经将结构体struct升级成了类,这是语法规定:

struct Stack
{
public:// 成员函数void Init(int defaultCapacity = 4){a = (int*)malloc(sizeof(int) * defaultCapacity);if (nullptr == a){perror("malloc fail");return;}capacity = defaultCapacity;top = -1;}void Push(int x){a[++top] = x;}void Destroy(){free(a);a = nullptr;top = capacity;}
private:// 成员变量int* a;int top;int capacity;
};int main()
{Stack st1;st1.Init(5);st1.Init();st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);st1.Destroy();return 0;
}

本期总结+下期预告

本期内容,我们正式进入C++初阶的类和对象部分,这是C++中非常重要的内容,下期内容继续为大家带来相关的知识!

感谢大家的关注,我们下期再见!
在这里插入图片描述

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

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

相关文章

Skyeye 云智能制造办公系统 VUE 版本 v3.15.13 发布

Skyeye 云智能制造,采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程,CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

Obsidian Copilot:打造你的专属 AI 笔记助手

Obsidian Copilot作为一款非常受欢迎的Obsidian插件,不仅极大地提升了用户的笔记管理和信息检索效率,还通过其多样化的AI功能为用户带来了前所未有的便捷体验。本文将详细介绍Obsidian Copilot的核心特点、使用方法及个人体验分享。 核心特点 Obsidian…

每日一题--计算机网络

一、基础概念类问题 1. TCP 和 UDP 的区别是什么? 回答示例: TCP:面向连接、可靠传输(通过三次握手建立连接,丢包重传)、保证数据顺序(如文件传输、网页访问)。 UDP:无…

使用 Spring 的 FactoryBean 创建和获取 Bean 对象

在Spring框架中,FactoryBean接口提供了一种强大的机制来创建复杂的bean实例。本文将基于提供的代码示例,详细介绍如何通过FactoryBean创建bean对象,并展示如何获取这些bean实例以及它们所属的FactoryBean实例。 示例代码类 定义 MyBean 接口…

制造业数字化转型,汽车装备制造企业数字化转型案例,智能制造数字化传统制造业数字化制造业数字化转型案例

《某制造业企业信息化整体解决方案》PPT展示了一个汽车装备企业的整体信息化解决方案,阐述了该企业的业务特点和现状,主要包括按订单生产、多级计划和产品跟踪等,分析了信息化建设的主要困难,如信息管理手工化、过程数据追溯困难、…

软链接 使用笔记 linux命令 if判断

目录 1>0判断怎么写: 1. 使用 [ ] 进行数值比较: 2. 使用 (( )) 进行数学运算: 3. 使用 [[ ]](主要用于字符串比较,不推荐用于数学运算): 软链接 使用笔记 1>0判断怎么写&#xff1a…

pycharm-python國際象棋遊戲代碼

嗯,用户的问题是“pycharm寫關於python國際象棋遊戲代碼”,也就是要用PyCharm来写一个Python的国际象棋游戏代码。我需要先整理一下用户提供的搜索结果,看看有什么相关的信息可以利用。 首先看搜索结果中的各个网页内容。网页1主要讲的是象棋…

【Film】MovieAgent:自动化电影生成通过多智能体CoT规划

论文概览 自动化电影生成根据剧本概要和角色库创建具有一 致角色、同步字幕和音频的长篇视频。它涉及自动化叙 事规划、场景结构化, 和镜头构图,复制现实世界电影制作的层次推理。 核心贡献 提出MovieAgent,通过多智能体链式思维(CoT)规划实现自动化电影生成。首次探索并…

数据结构——最短路(BFS,Dijkstra,Floyd)

完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型&#xff1a; 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…

ftp替代品,如何提升数据交换的安全性与高效性?

文件传输协议&#xff08;FTP&#xff09;是一个跨平台的、简单且易于实现的协议&#xff0c;用于在网络上的服务器和客户端之间传输文件&#xff0c;也是企业会经常选择的一种传输方式。 业务场景一&#xff1a; 基于信息相关安全要求&#xff0c;医院会采用防火墙、网闸等将…

单片机开发资源分析的实战——以STM32G431RBT6为例子的单片机资源分析

目录 第一点&#xff1a;为什么叫STM32G431RBT6 从资源手册拿到我们的对STM32G431RBT6的资源描述 第二件事情&#xff0c;关心我们的GPIO引脚输出 第三件事情&#xff1a;去找对应外设的说明部分 第一点&#xff1a;为什么叫STM32G431RBT6 对于命名规则不太熟悉的朋友看这里…

Android PC 要来了?Android 16 Beta3 出现 Enable desktop experience features 选项

在之前的 《Android 桌面窗口新功能推进》 我们就聊过&#xff0c;Google 就一直在努力改进 Android 的内置桌面模式&#xff0c;例如添加了适当的窗口标题、捕捉窗口的能力、悬停选项、窗口大小调整、最小化支持、app-to-web 等。 比如在搭载 Android 15 QPR 1 Beta 2 的 Pix…

IP关联是什么?怎么避免?

在跨境电商的道路上&#xff0c;大家好&#xff01;今天想和大家聊一聊一个非常重要的话题&#xff0c;那就是IP关联的问题。在商业活动中&#xff0c;了解如何避免IP关联对保护我们宝贵的商铺至关重要。接下来&#xff0c;我们将深入探讨IP关联的概念、影响及如何有效防止这一…

行为模式---状态模式

概念 状态模式是一种行为模式&#xff0c;用于在内部状态改变的时候改变其行为。它的核心思想就是允许一个对象在其内部状态改变的时候改变它的行为。状态模式通过将对象的状态封装成独立的类&#xff0c;并将其行为委托给当前的状态对象&#xff0c;从而使得对象行为随着状态…

目标检测中衡量模型速度和精度的指标:FPS和mAP

“FPS”和“mAP”分别衡量了模型的速度和精度。 FPS&#xff08;Frames Per Second&#xff09; 定义&#xff1a;FPS是“每秒传输帧数”的缩写&#xff0c;用于衡量计算机视觉系统&#xff08;如目标检测、图像识别等&#xff09;的实时性能。它表示系统每秒钟能够处理的图像…

网页复印机:只需一个网址,一键克隆任何网站!(可根据需求生成/优化相关代码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 网页代码克隆神器:一键复刻精美设计,提升前端开发效率 📒🛠️ 使用⚓️ 相关链接 ⚓️📖 介绍 📖 每天对着别人的精美网站漏出羡慕的眼神,却苦于自己的前端技术不够硬,难以完美复刻?或者为了赶项目进度,不得不重复…

go语言中数组、map和切片的异同

在Go语言中&#xff0c;数组、切片&#xff08;slice&#xff09;和映射&#xff08;map&#xff09;是三种常用的数据结构&#xff0c;它们在用途和特性上有显著差异。以下是它们的异同总结&#xff1a; 相同点 集合类型&#xff1a;三者都用于存储一组数据。 元素访问&#…

前端Vue3图像编辑功能(并生成mask图)

存在一个需求同豆包的图像生成的区域重绘功能,类似与下面这种 拆解一下需求, 1、鼠标移动上图像画面时出现跟随鼠标移动的空心圆形,移出图像画面、鼠标点击后、鼠标按下移动时消失,鼠标松开再次出现。 2、鼠标按下出现圆形透明颜色大小同空心圆形、鼠标按下移动形成轨迹,…

解决:ModuleNotFoundError: No module named ‘_sqlite3‘

报错&#xff1a; from _sqlite3 import * ModuleNotFoundError: No module named _sqlite3安装sqlite3支持组件: sudo apt-get install libsqlite3-dev进入之前下载的python包下&#xff0c;重新编译和安装Python ./configure --enable-loadable-sqlite-extensions make &a…

【Go语言圣经3.6】

目标 概念 常量与变量的主要区别在于&#xff1a; 不可变性&#xff1a;常量在声明后其值就固定下来&#xff0c;不能再被修改。这保证了程序运行时不会因意外修改而导致错误。 使用不可变数据&#xff08;例如数学常数 π&#xff09;可以避免意外修改带来的问题 编译期计算…