类和对象(上)

类和对象(上)

一、类的定义

        类有点类似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

在 OpenClaw 中安装 baidu-web-search skill(百度网页搜索技能)

在 OpenClaw 中安装 baidu-web-search skill(百度网页搜索技能),最推荐用 ClawHub CLI 一键安装,再配置百度千帆 API Key 即可使用。 一、前置准备 1. 安装 Node.js(v20+)与 npm/pnpm 验证安装 clawhub --version 全局安装 ClawHub CLI(OpenClaw 官方技能管理器) npminstall-g clawhub # 或国内加速pnpmadd-g clawhub 二、一键安装百度搜索技能 # 安装 baidu-search(百度网页搜索) clawhub install baidu-search --no-input * 安装路径:~/.openclaw/workspace/skills/baidu-search/

By Ne0inhk

【技术栈-前端】一文搞懂 dist 是什么

【技术栈-前端】一文搞懂 dist:它到底是什么?为什么你的项目总会出现 dist 目录? 在很多项目里,你会反复看到一个名字:dist。它可能是一个文件夹(dist/),也可能出现在命令里(npm run build 之后生成 dist),甚至在 Python 打包发布时也会出现(dist/*.whl、dist/*.tar.gz)。 这篇文章就把 dist 讲透:概念、常见场景、生成方式、配置方法、部署与最佳实践、常见坑 一次说清。 文章目录 * 【技术栈-前端】一文搞懂 dist:它到底是什么?为什么你的项目总会出现 dist 目录? * 1. dist 是什么?一句话解释 * 2. dist

By Ne0inhk
百度天气:空气质量WebGIS可视化的创新实践 —— 以湖南省为例

百度天气:空气质量WebGIS可视化的创新实践 —— 以湖南省为例

目录 前言 一、空气质量展示需求 1、满城火辣味周末 2、空气质量状况 二、WebGIS展示百度天气 1、关于空气质量等级 2、数据查询实现 3、Leaflet集成百度空气质量 三、成果展示 1、整体展示 2、中、重污染地区 3、低、优质地区 4、污染严重前10区县 5、质量优前10区县 四、总结 前言         在当今数字化时代,地理信息系统(GIS)技术与网络技术的深度融合,催生了 WebGIS 这一强大的信息展示与分析平台。它能够将复杂的空间数据以直观、交互的方式呈现给用户,极大地提高了信息的可理解性和可用性。空气质量作为与人们生活息息相关的重要环境指标,其数据的可视化呈现对于公众健康、环境管理和决策支持都具有极为重要的意义。基于百度天气开展空气质量 WebGIS 可视化实践,正是这一领域创新探索的生动体现。

By Ne0inhk
Rust与WebAssembly深度实战——将高性能Rust代码运行在浏览器与Node.js

Rust与WebAssembly深度实战——将高性能Rust代码运行在浏览器与Node.js

Rust与WebAssembly深度实战——将高性能Rust代码运行在浏览器与Node.js 一、学习目标与重点 1.1 学习目标 1. 理解WebAssembly基础:深入掌握WebAssembly(Wasm/Wasmtime)的核心定义、运行机制、与JavaScript的性能对比 2. 掌握Rust到Wasm的编译:熟练使用wasm-pack、cargo-web等工具链,完成Rust代码到Wasm模块的编译、打包、优化 3. 精通Rust与JavaScript交互:实现双向交互(Rust调用JS函数、JS调用Rust函数),处理复杂数据类型(数组、对象、字符串),管理内存(Wasm线性内存的分配与释放) 4. 开发真实Wasm应用:编写浏览器端高性能任务(Canvas图像滤镜、WebGL计算辅助)、Node.js端计算密集型任务(图像处理、加密解密、数据压缩) 5. 优化Wasm模块:使用wasm-opt工具优化Wasm体积,学习代码分割、懒加载、模块缓存

By Ne0inhk