当前位置: 首页 > news >正文

封装文档核心知识点总结(通俗版)

一、文档核心知识点总结(通俗版)

1. 封装:把数据和功能打包成一个类
  • 目的:隐藏细节,只暴露必要的接口。比如把 “学生” 的姓名、成绩和相关操作(如显示成绩)封装成Stu类。
  • 实现:用private隐藏数据,public暴露方法(如show()setScore())。
  • 案例:文档中的mystring类封装字符串操作(拷贝、拼接、比较),File类封装文件读写。
2. 构造函数:对象的 “出生证明”
  • 作用:创建对象时自动初始化成员变量。
  • 特点
    • 函数名与类名相同,无返回值(连void都不写)。
    • 可重载(参数不同),如无参构造、有参构造、拷贝构造。
    • 自动补全:若不写任何构造函数,编译器会补全无参构造;若手写构造函数,编译器不再补全无参构造(需手动添加)。
  • 初始化列表:在构造函数中用:初始化成员变量,如Stu(int id, string name) : id(id), name(name) {}
3. 析构函数:对象的 “清理工”
  • 作用:对象生命周期结束时自动释放资源(如堆内存、文件句柄)。
  • 特点
    • 函数名是类名前加~(如~Stu()),无参数、无返回值。
    • 若不手写,编译器自动补全空析构函数;若类中有动态资源(如new/malloc),必须手写释放逻辑。
4. 运算符重载:让自定义类支持 “特殊操作”
  • 作用:让自定义对象能使用常见运算符(如+<<[])。
  • 案例
    • mystring类重载+实现字符串拼接,重载<<实现cout << str
    • Complex类重载+-实现复数运算。
  • 注意
    • 流运算符<</>>需定义为类的友元函数(因为要访问私有成员,且属于ostream/istream类的操作)。
    • 下标运算符[]通常返回引用(如char& operator[](int idx)),支持读写。
5. 引用:变量的 “别名”
  • 作用:给变量取别名,本质是同一内存地址的不同名字。
  • 特点
    • 必须初始化(如int a=10; int& b=a;),一旦绑定不可更改。
    • 常用于函数参数(如void func(int& x)),避免拷贝构造,提高效率。
6. 静态成员:属于类而非对象的数据 / 函数
  • 静态变量
    • 所有对象共享,存储在静态存储区(如银行类的利率static double rate)。
    • 需在类外初始化(如double Bank::rate = 3.15;)。
  • 静态函数
    • this指针,只能访问静态成员。
    • 可通过类名::函数名直接调用(如Bank::getRate())。
7. 单例模式:保证类只有一个实例
  • 作用:确保一个类全局只有一个对象(如文件管理器、数据库连接池)。
  • 分类
    • 懒汉模式:首次使用时创建对象,线程不安全(需加锁)。
    • 饿汉模式:程序启动时创建对象,线程安全(简单但浪费内存)。
  • 实现关键:私有化构造函数,通过静态成员函数返回唯一实例。
8. 友元函数 / 类:打破封装的 “特殊权限”
  • 作用:允许外部函数 / 类访问当前类的私有成员。
  • 案例
    • friend ostream& operator<<(ostream&, const Complex&):让cout << complex能访问Complex的私有成员。
    • 友元类B的所有函数可访问类A的私有成员(在A中声明friend class B;)。
9. lambda 表达式:匿名的 “一次性” 函数
  • 作用:无需命名,直接定义并使用函数(常用于回调函数、排序比较等)。
  • 语法

    cpp

    [捕获列表](参数列表) mutable -> 返回类型 { 函数体 }
    
     
    • 捕获列表:按值[=]或引用[&]捕获外部变量。
    • mutable:允许修改按值捕获的变量。
    • 返回类型:可省略,自动推导。
  • 案例sort(arr.begin(), arr.end(), [](int a, int b){ return a > b; });(降序排序)。

二、作业解析:封装msgqueue

作业要求

实现一个消息队列类msgqueue,支持:

  1. msgqueue msg("文件名"):根据文件名创建消息队列。
  2. 析构函数销毁消息队列。
  3. msg[1] << "hello":将数据写入 1 频道。
  4. msg[1] >> str:从 1 频道读取数据到str
实现思路
  1. 数据结构

    • string filename存储文件名。
    • map<int, queue<string>> channels管理各频道的消息队列(频道号为键,消息队列为值)。
  2. 构造与析构

    • 构造函数:根据文件名初始化(可能关联系统消息队列,如使用msgget创建 IPC 消息队列)。
    • 析构函数:销毁消息队列(如msgctl(IPC_RMID))。
  3. 运算符重载

    • operator[]:根据频道号返回对应频道对象(内部类Channel)。
    • Channel类重载<<>>:实现消息的入队和出队。
  4. 系统调用(简化版,仅模拟逻辑)

    • 实际项目中需使用系统 API(如 POSIX 消息队列mq_open等),此处用map模拟频道存储。
参考代码(简化模拟)

cpp

#include <iostream>
#include <map>
#include <queue>
#include <string>
using namespace std;// 内部类:代表一个消息频道
class Channel {
public:void write(const string& data) {q.push(data); // 模拟入队}void read(string& data) {if (!q.empty()) {data = q.front(); // 模拟出队q.pop();}}
private:queue<string> q; // 频道内的消息队列
};class msgqueue {
public:explicit msgqueue(const string& filename) : filename_(filename) {// 实际此处应调用系统函数创建消息队列(如msgget)cout << "创建消息队列,文件名:" << filename_ << endl;}~msgqueue() {// 实际此处应销毁消息队列(如msgctl(IPC_RMID))cout << "销毁消息队列,文件名:" << filename_ << endl;channels_.clear();}// 重载[]获取频道Channel& operator[](int channel_id) {return channels_[channel_id]; // 自动创建不存在的频道}private:string filename_; // 消息队列关联的文件名map<int, Channel> channels_; // 频道号 -> 频道对象
};int main() {msgqueue msg("msgqueue.txt");msg[1] << "hello"; // 写入1频道msg[1] << "world";string str;msg[1] >> str; // 读取1频道cout << "读取到:" << str << endl; // 输出:helloreturn 0;
}
关键点说明
  1. 频道管理:用map<int, Channel>存储各频道,operator[]自动创建不存在的频道。
  2. 消息读写Channel类用队列模拟消息存储,<<入队,>>出队(简化逻辑,实际需处理线程安全、序列化等)。
  3. 系统交互:实际项目中需替换为真实的系统消息队列 API(如 Linux 的msggetmsgsndmsgrcv),并处理消息类型和权限。

相关文章:

  • 局域协作中的前端调试:WebDebugX 在本地多端调试中的实践
  • 自动驾驶中的博弈式交互规划:从理论到实践
  • @vue/composition-api
  • LINUX安装运行jeelowcode后端项目(idea启动)
  • kerberos在无痕浏览器 获取用户信息失败 如何判断是否无痕浏览器
  • 设计模式-开放封闭原则
  • AI智能体策略FunctionCalling和ReAct有什么区别?
  • Qtc++开发遇到的问题-按钮点击不管用?
  • 大模型三大缺陷与RAG破解之道
  • 【leetcode】977. 有序数组的平方
  • ComfyUI 文生图,绘图要求中 正向提示词、负向提示词 有什么区别,webp又是什么格式 comfyui 那么喜欢它
  • 导出rpm包的方法
  • 【监控】Prometheus中的告警机制介绍
  • 与 PyCharm 官方沟通解决开发环境问题记录(进展:官方已推出2个新的修复版本)
  • 打造自己的开源组件:如何将 Starter 发布到 Maven Central?
  • 经典查找算法合集(上)
  • 59、【OS】【Nuttx】编码规范解读(七)
  • 【MQTT】TLS证书双向验证
  • ROS2 robot控制学习(一)
  • Java 并发编程通关秘籍——08死锁
  • wordpress 采集公众号/长沙优化科技有限公司
  • 江津网站建设怎么样/windows优化工具
  • 建设pc端网站是什么意思/自助建站系统下载
  • dede发布网站/企点官网
  • 小型手机网站建设多少钱/如何检测网站是否安全
  • 得物网上商城/网站编辑seo