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;
}
在这里,我们主要是熟悉一下类的使用,没有详细实现具体的内容,关于栈,在数据结构专栏中已经进行了详细的讲解。在一个类中,重要的是访问限定符——public、private和protect,我们详细介绍一下:
- public修饰的成员在类外可以直接被访问
- protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
- 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
- 如果后面没有访问限定符,作用域就到 } 即类结束。
- class的默认访问权限为private,struct为public(因为struct要兼容C)
如图所示:

struct(结构体)在C语言中,里面是不可以定义函数的,但是在C++中,struct升级成了类,可以定义成员函数,但是struct里面的内容默认是公开的(public),外界可以随意访问,也是兼容了C语言结构体的性质,但class就不一样了:


class默认是私有,需要加上public声明才能被访问,如图:


允许外界访问的是函数func,至于成员变量a、b,则是不想公开的。 - 在这里,我们也可以在类里面给出函数的声明,在类的外面给出函数的定义:

这里需要指定函数Print是属于A这个类域。
我们来看下面一段代码:

这里的year=year含义就不清楚了,到底是形参自己赋值给自己还是将形参赋值给成员变量?因此我们应当这样写:

三、类的实例化
类定义仅仅是逻辑的蓝图,就像是一个房间的设计图纸,并不能真正的住进去,因此,我们需要对类进行实例化才会创建出具体的对象,分配内存空间,简而言之,用类创建对象的过程,称为类的实例化。同一个类可以实例化出多个不同的对象,比如:在特斯拉工厂的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),元素入栈,栈的销毁等等,如果不进行实例化,是没有任何意义的,比如:


直接对着图纸插入数据,显然是没有任何意义的。
那么,我们刚才定义函数不是用了::吗?

注意,这里是定义,其实还是在画图纸,并不是真正的使用。在类体外定义成员时,需要使用 :: 域作用限定符指明成员属于哪个类域,比如在类里面声明一个成员函数,在类外面定义时,就要使用 ::。
还有一个问题,在链表中,我们特意强调了结构体是自定义类型,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++中非常重要的内容,下期内容继续为大家带来相关的知识!
感谢大家的关注,我们下期再见!

相关文章:
C++初阶——类和对象(一)
C初阶——类和对象(一) 一、面向过程和面向对象 1.面向过程 面向过程的程序设计(Procedure-Oriented Programming),简称POP,是一种是以程序执行流程为核心的编程范式。它是先分析出解决问题所需要的的步…...
1141. 【贪心算法】排队打水
题目描述 有n(n<1000)个人在一个水龙头前排队接水,假如每个人接水的时间为Ti, 请编程找出这n个人排队的一种顺序,使得n个人的平均等待时间最小。输入 输入文件共两行,第一行为n; 第二行分别…...
RabbitMQ入门:从安装到高级消息模式
文章目录 一. RabbitMQ概述1.1 同步/异步1.1.1 同步调用1.1.2 异步调用 1.2 消息中间件1.2.1 概念1.2.2 作用1.2.3 常见的消息中间件1.2.4 其他中间件 1.3 RabbitMQ1.3.1 简介1.3.2 特点1.3.3 方式1.3.4 架构1.3.5 运行流程 二. 安装2.1 Docker 安装 RabbitMQ 三. 简单队列&…...
Linux应用:进程的回收
进程的诞生和消亡 程的诞生通常是通过系统调用(如fork、exec等)来创建新进程。当一个进程完成其任务或者出现错误时,它会进入消亡阶段。进程可以通过exit函数主动结束自身,也可能由于操作系统的调度策略(如资源耗尽、…...
如何利用 AI 技术快速定位和修复生产环境问题
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Linux find 命令完全指南
find 是 Linux 系统最强大的文件搜索工具,支持 嵌套遍历、条件筛选、执行动作。以下通过场景分类解析核心用法,涵盖高效搜索、文件管理及高级技巧: 一、基础搜索模式 1. 按文件名搜索(精确/模糊匹配) <BASH> f…...
市场波动中的风险管理与策略优化
市场波动中的风险管理与策略优化 在市场交易中,价格的波动性为投资者提供了交易机会,但同时也带来了风险。如何在市场不确定性中进行有效的风险管理,并优化交易策略,是每位交易者都需要思考的问题。本文将探讨市场波动的影响因素、…...
(链表)206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: 输入&am…...
Jetson Orin NX jupyter lab的安装和使用
主要是为了梳理一下整个过程,其实步骤很简单,但容易出错。 注意,实际只有两个文件需要写入,一个是jupyter_lab_config.py,一个是jupyter.service。 配置文件的名字要写对,如果总是copy网上的代码࿰…...
前端npm包- CropperJS
文章目录 一、CropperJS**核心特性****官网与文档****安装与使用**1. **通过 npm/yarn/pnpm 安装**2. **HTML 结构**3. **引入 CSS 和 JS**4. **初始化裁剪器** **相关插件/替代方案****适用场景****注意事项** 总结 一、CropperJS cropperjs 是一个轻量级、功能强大的 图片裁…...
农业建设项目管理系统评测:8款推荐工具优缺点分析
本文主要介绍了以下8款农业建设项目管理系统:1.PingCode; 2. Worktile ;3. 建米农业工程项目管理系统;4. 开创云数字农业管理平台; 5. Trimble Ag Software;6.Conservis; 7. Agworld ࿱…...
linux 命令 tail
tail 是 Linux 中用于查看文件末尾内容的命令,常用于日志监控和大文件快速浏览。以下是其核心用法及常见选项: 基本语法 tail [选项] 文件名 常用选项 显示末尾行数 -n <行数> 或 --lines<行数> 指定显示文件的最后若干行(…...
测试开发 - 正浩创新 - 一面面经(已OC)
自我介绍 实习过程中,有遇到过什么问题,是如何解决的 实习成果中的数据指标变化,人力消耗一直在递减,是什么原因 实习工作有很多模块,那一块工作对你的提升或者收获是比较大的 讲一下,简历中所罗列的几…...
实验8 搜索技术
实验8 搜索技术 一、实验目的 (1)掌握搜索技术的相关理论,能根据实际情况选取合适的搜索方法; (2)进一步熟悉盲目搜索技术,掌握其在搜索过程中的优缺点; (3)…...
VSTO(C#)Excel开发9:处理格式和字体
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
LinkedList底层结构和源码分析(JDK1.8)
参考视频:韩顺平Java集合 特点 LinkedList 底层实现了 双向链表 和 双端队列 的特点。可以添加任意元素(元素可以重复),包括 null。线程不安全,没有实现同步。 LinkedList 底层结构 LinkedList 底层维护了一个双向链…...
数字内容体验的技术支柱是什么?
数据分析引擎构建基础 数字内容体验的技术底座始于对海量用户行为数据的深度解析。作为技术体系的根基,数据分析引擎通过实时采集、清洗与结构化处理,将分散的点击轨迹、停留时长及交互偏好转化为可操作的洞察。其核心能力体现在三方面:一是…...
C# 使用Markdown2Pdf把md文件转换为pdf文件
NuGet安装Markdown2Pdf库,可以把格式简单markdown文件转换为pdf。但该库用了Puppeteer Sharp,因此会在运行过程中提示指定Chrome浏览器路径或自动下载Chrome浏览器。 代码如下: using Markdown2Pdf;var converter new Markdown2PdfConverte…...
专家系统如何运用谓词逻辑进行更复杂的推理
前文,我们讲解了命题逻辑和谓词逻辑的基本概念、推理规则、应用以及一些简单的示例。具体内容可以先看我的文章:人工智能的数学基础之命题逻辑与谓词逻辑(含示例)-CSDN博客 那么形如专家系统这类复杂系统,是如何通过谓…...
html css网页制作成品——糖果屋网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Ubuntu上部署Flask+MySQL项目
一、服务器安装python环境 1、安装gcc(Ubuntu默认已安装) 2、安装python源码 wget https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz 3、安装Python依赖库 4、配置python豆瓣源 二、服务器安装虚拟环境 1、安装virtualenv pip3.10 ins…...
落雪音乐Pro 8.8.6 | 内置8条音源,无需手动导入,纯净无广告
洛雪音乐Pro版内置多组稳定音源接口,省去手动导入的繁琐操作,安装即可畅听海量音乐。延续原版无广告的纯净体验,支持歌单推荐与音源切换,满足个性化听歌需求。此版本仅支持在线播放,无法下载音乐,且与原版不…...
什么是全栈?
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点下班 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 📃文章前言 🔷文章均为学习工…...
一些docker命令
一、基础命令 查看 Docker 版本 docker --version 或 docker version:显示 Docker 客户端和服务器的版本信息。 查看 Docker 系统信息 docker info:显示 Docker 系统的详细信息,包括镜像、容器数量、存储驱动类型等。 Docker 服务管理 s…...
《DeepSeek 开源 DeepGEMM:开启AI计算新时代的密钥》:此文为AI自动生成
《DeepSeek 开源 DeepGEMM:开启AI计算新时代的密钥》:此文为AI自动生成 引言:AI 计算的新曙光 在当今科技飞速发展的时代,人工智能(AI)无疑是最为耀眼的领域之一。从语音助手到自动驾驶,从图像…...
OpenCV实现图像特征提取与匹配
一、特征检测与描述子提取 选择特征检测器 常用算法包括: ORB:一种高效的替代SIFT和SURF的算法,主要用于移动机器人和增强现实等领域。适合实时应用,结合FAST关键点与BRIEF描述子。SIFT(尺度不变特征变…...
将分支`XXX`合并到远程分支`master
将分支feat-task合并到远程分支master 首先,切换到本地的 master 分支 git checkout master确保你的本地 master 分支是最新的,拉取远程的更新 git pull origin master将 feat-task 分支的代码合并到 master 分支 git merge feat-task如果在合并过程…...
程序化广告行业(13/89):DSP的深入解析与运营要点
程序化广告行业(13/89):DSP的深入解析与运营要点 大家好!一直以来,我都对程序化广告行业保持着浓厚的学习兴趣,在探索的过程中积累了不少心得。今天就想把这些知识分享出来,和大家一起学习进步…...
XML文件格式的简介及如何用Python3处理XML格式对象
诸神缄默不语-个人技术博文与视频目录 文章目录 1. XML格式简介2. 格式化XML文件的工具3. Python处理XML:xml库1. xml.etree.\(c\)ElementTree2. xml.dom.minidom 4. 本文撰写过程中参考的其他网络资料 1. XML格式简介 可扩展标记语言 (Extensible Markup Language…...
通过qemu仿真树莓派系统调试IoT固件和程序
通过qemu仿真树莓派系统调试IoT固件和程序 本文将介绍如何使用 QEMU 模拟器在 x86 架构的主机上运行 Raspberry Pi OS(树莓派操作系统)。我们将从下载镜像、提取内核和设备树文件,到启动模拟环境,并进行一些常见的操作࿰…...
