1. 项目设计和结构 1.1 客户端(图形界面部分) 客户端部分主要使用Qt框架实现图形界面,并通过TCP协议与服务端进行通信。客户端分为八个文件,分别为: home.cpp 和 home.h:这两个文件负责主界面的实现。home类继承自QMainWindow,负责创建和管理智能家居的图形界面,包括显示天气动画、处理按钮点击事件(控制家电的开关)和…
std::map 和 std::unordered_map 都是 C++ 标准库中提供的关联容器,它们用于存储键值对,并且允许我们通过键来高效地查找对应的值。然而,它们之间有一些重要的区别,主要体现在 存储方式、查找效率 和 元素的顺序 等方面。 1. 底层数据结构 std::map:底层通常使用 红黑树(或其他平衡二叉搜索树)来存储数据。红黑树是…
多态实现的原理 静态多态:函数重载,编译器确定 函数重载:允许同一个作用域内声明多个功能类似的同名函数,这些函数的参数列表、参数个数、参数类型或参数顺序不一样,需要注意的是不能通过返回值类型来区别重载。 实现原理 函数名修饰 编译过程 预编译:把头文件当中的函数声明拷贝到源文件中,避免编译过程中的语法分析找不到函数定义。 编译:语法分析,同时进行符…
语法糖 关键字 1. auto auto 关键字用于自动推导变量的类型,编译器根据初始化表达式的类型来推导出变量的类型。它避免了手动指定复杂类型,尤其在涉及迭代器、容器或模板类型时,auto 显得特别有用。 作用: 自动推导变量类型。 避免重复和复杂的类型声明,尤其适用于迭代器、模板类等类型。 示例: #include <iostream&g…
const 关键字 const 用于修饰变量、指针、引用、成员函数。 修饰变量:变量的值不能修改。(const int MAX_SIZE = 100;) 常量指针:不能通过指针修改该值(不能修改数据),但是可以改变指针的指向(可以修改地址)。( int a = 10; int b = 20; const int* ptr = &a; ptr…
动态库和静态库的区别 生成方式:在Linux系统下,静态库源码文件使用ar rcs xxx.a xxx.o ...编译生成 .a文件,然后使用g++ static xxx.c -o xxx -L./ -lapi -I./直接生成可执行文件。同样的在Linux系统下,动态库源码文件使用g++ -shared -fPIC -o xxx.so xxx.o…
友元函数 友元函数是一个被声明为友元的非成员函数,可以使普通函数访问到类的保护成员和私有成员,必须显式地声明为 friend。 例如下面这段函数,如果在类内重载“<<”、“>>”,stream和this会抢第一个参数,如果在类外重载“<<”、“>>”,函数就访问不到Data的私有成员,使用友元函数恰好…
CPU背景: 读写策略:在CPU中进程间读写同一数据时是异步进行的,当线程1想要读写一个数据时,CPU会先分出一块缓存,然后把数据从主存区读到缓存区,再进行接下来的操作,但是此时线程1可能会不同步主存而在缓存中进行操作,如果有一个线程2也想读写同一数据,那么它就会从主存里面直接获取,这会导致线程1的读写操作没有同步到线程2,出现数据不同步的问题。 …
题目:unique_ptr是怎么实现的? unique_ptr的使用场景: 作为一个类的成员变量,只在本类使用,不会被赋值给其他类,也不会作为参数传递给某个函数。 作为一个局部变量,函数结束,自动释放托管资源。 unique_ptr是智能指针,自动释放资源: 通过对象的生命周期来管理指针的生命周期。 用于解决漏写delete语句而造成的内存泄漏。 …
这个项目是一个手写输入法系统,集成了多个模块和功能,包括手写识别、符号和数字选择、界面管理、设置配置等。以下是对项目的详细分析,涵盖其数据结构、算法、使用的技术和API、重写的Qt控件、UI设计等方面。 1. 项目设计概述 这个手写输入法项目的核心目标是通过手写识别技术进行字符输入,同时支持符号、数字和英文字符的选择。项目设计中使用了Qt框架,结合…