类和对象(上)

类和对象(上)

一、类的定义

        类有点类似c语言的结构体是一种自定义类型,但类里面除了定义一些成员变量外还有方法(成员函数),在访问的时候要指定类域。

        在类定义时首先用一个class关键字,在后面接着类的名字,然后使用{ }在花括号里面定义成员变量和成员函数,最后需要在花括号外加分号,如下:

class Stack { void Init(int n = 4) { arr = (int*)malloc(sizeof(int) * n); if (nullptr == arr) { perror("malloc申请空间失败"); return; } capacity = n; size = 0; } //...... int* arr; size_t size; size_t capacity; };

这里calss也可以替换成struct,在类里面的函数默认都为内联函数,当然它不一定都展开具体还取决于编译器。

二、访问限定符

        在定义类的时候通常会用一些关键字来限定类成员的访问,访问限定符有public,private,protected。

  • public修饰的成员在类外可以直接被访问;protected和private修饰的成员在类外不能直接被访问,protected和private的具体区别这里先不讲解。
  • 访问权限作⽤域从该访问限定符出现的位置开始直到下⼀个访问限定符出现时为⽌,如果后⾯没有访问限定符,作⽤域就到}即类结束。
  • class定义成员没有被访问限定符修饰时默认为private,struct默认为public
  • ⼀般成员变量都会被限制为private/protected,需要给别⼈使⽤的成员函数会放为public。
class Stack { public: void Init(int n = 4) { arr = (int*)malloc(sizeof(int) * n); if (nullptr == arr) { perror("malloc申请空间失败"); return; } capacity = n; size = 0; } //...... private: int* arr; size_t size; size_t capacity; };

三、类域

        类成员受到类域限制,在访问的时候需要指明类域,像命名空间一样使用::指明类域,如果一个函数声明在类里,定义在类外,那么在定义函数的时候就得使用::指明类域,如下:

class Stack { public: void Init(int n = 4); //...... private: int* arr; size_t size; size_t capacity; }; void Stack::Init(int n = 4) { arr = (int*)malloc(sizeof(int) * n); if (nullptr == arr) { perror("malloc申请空间失败"); return; } capacity = n; size = 0; } 

当然访问类域内的函数通常都使用类对象加点( . ) 操作符去访问,如下:

四、实例化

        类就像是一栋房子的图纸,而用类去定义对象就类似使用图纸建造房子,这个过程就叫做实例化。

        类是不占用内存的,只有实例化后才会占内存,就像只有把图纸建造出房子后才占用地盘一样。而那么计算一个对象的内存呢?

五、对象的大小

        对象与对象之间主要区别在于成员变量的值,而同一个类的所有对象的成员函数都是一样的,所以成员函数并不储存在对象里面,只用考虑成员变量所占的内存,而成员变量占用的内存和结构体的内存计算方法一样,因为它们都存在内存对齐。需要注意的是静态成员并不是储存在对象里面(和成员函数同理),而是储存在静态区,不能算入。在类里面的静态成员与在全局申请的静态成员区别在于类成员受到类域的限制。

        如果一个类里面一个成员变量都没有那么按上面逻辑来说它实例化出来的对象占的空间应该是0,而对于这种情况编译器做了特殊处理,它所占的空间为1字节。

六、this指针

        类中有Init等成员函数,函数体中没有关于不同对象的区分,那当对象d1调⽤Init和其它函数时,该函数是如何知道应该访问的是d1对象还是d2对象呢?在这里C++给了⼀个隐含的this指针解决这⾥的问题。
        编译器编译后,类的成员函数默认都会在形参第⼀个位置,增加⼀个当前类类型的指针,叫做this指针。⽐如Stack类的Init的真实原型为, void Init(Stack* const this, int n=4)。                              C++规定不能在实参和形参的位置显⽰的写this指针(编译时编译器会处理),但是可以在函数体内显示使⽤this指针。
        类的成员函数中访问成员变量,本质都是通过this指针访问的,如Init函数中给size赋值, 可以看做this->size = 0;

Read more

人工智能:循环神经网络(RNN)与序列数据处理实战

人工智能:循环神经网络(RNN)与序列数据处理实战

循环神经网络(RNN)与序列数据处理实战 1.1 本章学习目标与重点 💡 学习目标:掌握循环神经网络的核心原理、经典变体结构,以及在文本序列任务中的实战开发流程。 💡 学习重点:理解 RNN 的循环计算机制,学会使用 TensorFlow/Keras 搭建基础 RNN 与 LSTM 模型,完成文本分类任务。 1.2 循环神经网络核心原理 1.2.1 为什么需要 RNN 💡 传统的前馈神经网络(如 CNN、全连接网络)的输入和输出是相互独立的。它们无法处理序列数据的上下文关联特性。 序列数据在现实中十分常见,比如自然语言文本、语音信号、时间序列数据等。这些数据的核心特点是,当前时刻的信息和之前时刻的信息紧密相关。 循环神经网络通过引入隐藏状态,可以存储历史信息,从而有效捕捉序列数据的上下文依赖关系。 1.2.2 RNN

By Ne0inhk

ubuntu24.04安装 openClaw+kimi2.5+飞书 详细教程

文章目录 * ubuntu24.04安装openClaw详细教程 * 准备工作: * 一、申请飞书小机器人 * 1.登录/注册 飞书账号 * 2.添加一个机器人 * 3.开通权限 im和用户相关的 * 4.复制需要的配置 * 注册大模型API * 1.登录/注册KIMI账号,进入开发者工作台 * 2.在API Key管理创建一个key * 安装openClaw * 开始配置,选QuickStart * 配置大模型 * 配置飞书 * 其他配置 * 配置飞书回调 * 飞书对话使用 * 问题处理 * 使用飞书发消息返回 access not configured. * openclaw-gateway 运行异常 * 有个飞书的警告,具体找不到了,好像是feishu overwrite什么鬼 ubuntu24.04安装openClaw详细教程 想看视频的话,推荐B站大佬 林粒粒呀 的windows安装openClaw

By Ne0inhk
做鸿蒙 App 一个月:10 个 ArkUI 大坑

做鸿蒙 App 一个月:10 个 ArkUI 大坑

子玥酱(掘金 / 知乎 / ZEEKLOG / 简书 同名) 大家好,我是子玥酱,一名长期深耕在一线的前端程序媛 👩‍💻。曾就职于多家知名互联网大厂,目前在某国企负责前端软件研发相关工作,主要聚焦于业务型系统的工程化建设与长期维护。 我持续输出和沉淀前端领域的实战经验,日常关注并分享的技术方向包括前端工程化、小程序、React / RN、Flutter、跨端方案, 在复杂业务落地、组件抽象、性能优化以及多端协作方面积累了大量真实项目经验。 技术方向:前端 / 跨端 / 小程序 / 移动端工程化 内容平台:掘金、知乎、ZEEKLOG、简书 创作特点:实战导向、源码拆解、少空谈多落地 文章状态:长期稳定更新,大量原创输出 我的内容主要围绕 前端技术实战、真实业务踩坑总结、框架与方案选型思考、行业趋势解读 展开。文章不会停留在“API 怎么用”,而是更关注为什么这么设计、在什么场景下容易踩坑、

By Ne0inhk
Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 appstream 的鸿蒙化适配指南 - 驾驭 Linux 生态元数据规范,打造高性能、标准化、国际化的 OpenHarmony 桌面应用商店分发基石 前言 随着鸿蒙(OpenHarmony)生态向 PC 和平板端的高速扩张,如何为海量的三方软件建立一套标准化的“数字档案”,成了构建应用商店生态的核心痛点。过去,开发者提交应用信息时,往往采用碎片化的 JSON 或自定义文档。这会导致软件分发时详情页展示不一、多语言支持混乱,甚至连基本的截图和版本日志都难以对齐。 为了解决这个问题,我们需要引入一套具备全球化视野的元数据定义标准。appstream 作为 Linux 生态下最重要的应用信息描述规范,能够通过结构化的 XML 标签,精准定义软件的身世、功能和展示资产。适配到鸿蒙平台后,它不仅能让你的重型“鸿蒙私有应用商店”瞬间具备吞金般的解析能力,

By Ne0inhk