2023-06-06 单例模式 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,其核心目的是确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。这种模式特别适用于那些系统中需要通过一个单一对象来协调操作的场景,例如配置管理器、线程池、缓存、日志对象等。在单例模式的实现中,通常会有以下几个特点:私有的构造函数:为了避免外部通过 new 或其他方式创建多个实例,单例类的构造函数是私有的。持有自身的静态私有实例:单例类内部会自行创建一个静态私有实例,这保证了全局只有一个此类的实例。公共的静态方法访问实例:单例类提供一个公共的静态方法(通常命名为 instance() 或 getInstance()),用于全局访问唯一的实例。线程安全(可选,根据需要):如果单例需要在多线程环境中使用,其实例化过程需要是线程安全的。class singlePattern { private: singlePattern() {}; static singlePattern* p; public: static singlePattern* instance(); clas... 2023-06-06 2023年06月06日 0 阅读 0 评论
2023-04-04 strlen&&sizeof strlen&&sizeof strlen和sizeof是C和C++中常用的两个操作,但它们用于不同的目的:strlenstrlen函数用于计算字符串的长度,不包括终止字符\0。它是C标准库的一部分,在<cstring>或<string.h>头文件中定义。strlen只能用于以null结尾的字符数组(C风格字符串),它通过遍历字符串直到找到\0来计算字符串的长度。sizeofsizeof是一个编译时操作符,用于计算类型或变量占用的字节数。它可以用于任何类型的对象,包括基本类型(如int、float)、数组、结构体等,并且结果在编译时就已确定。对于数组,sizeof返回的是整个数组占用的内存大小,而不是数组中存储的字符串的长度。示例#include <iostream> #include <cstring> // 对于C++,包含strlen int main() { char str[] = "hello"; // 字符串"hello"实际占用6个字节:'h', 'e', 'l', 'l', 'o', '\0' ... 2023-04-04 2023年04月04日 0 阅读 0 评论
2023-04-03 公共变量 公共变量 下面内容由 gpt 🤖生成可以不同类设置一个同类型的成员变量,让所有类的这个成员变量都赋值为同一个对象,就可以做到在一个类修改这个对象里的数据,其它类也有变化。在面向对象编程中,如果需要在不同的子类中访问一个公共变量,通常会使用以下几种方式来实现这一需求:1. 通过基类维护公共变量最常见的方法是在一个共同的基类中定义这个变量,然后通过继承让所有子类都能访问这个变量。class BaseClass { protected: static int commonVariable; // 静态变量,由所有实例共享 public: static int getCommonVariable() { return commonVariable; } static void setCommonVariable(int value) { commonVariable = value; } }; int BaseClass::commonVariable = 0; // 初始化静态成员变量 class SubClass1 : public BaseClass { ... 2023-04-03 2023年04月03日 0 阅读 0 评论
2023-03-17 计算机网络学习笔记1 计算机网络学习笔记1 计算机网络篇一个完整的 http 连接的过程是怎样的?DNS(Domain System Name) 是什么?DNS 解析的过程为什么 DNS 使用 UDP 协议什么是区域传送? 为什么区域传送用 TCP 协议指的是 DNS 服务器之间同步数据的过程什么是TCP粘包/拆包?发生的原因?TCP 粘包粘包现象发生在发送方连续发送了多个包,而接收方接收时这些包被合并为一个或几个大包。这通常发生在以下情况:发送方连续快速发送小数据包:如果发送方连续发送多个小数据包,TCP 协议可能会将这些小包合并成一个大包发送,以提高网络效率和降低头部开销。接收方接收缓冲区不及时处理:如果接收方的应用层没有及时处理接收缓冲区的数据,多个包可能在接收缓冲区中累积,形成粘包。TCP 拆包拆包是指一个较大的数据包在发送过程中被分割成多个小包。这可能由于几个原因导致:MSS(最大段大小)限制:TCP 协议会根据网络条件(如 MTU,最大传输单元)和对方的接收能力,将大数据包分割为合适大小的小包进行发送。流控制和拥塞控制:TCP 协议中的流控制和拥塞控制机制可能会导致大包被分割,以适应网络状况。TCP三次握手 🤝... 2023-03-17 2023年03月17日 0 阅读 0 评论
2023-03-11 计算机网络学习笔记2 计算机网络学习笔记2 The OSI (Open Systems Interconnection) model consists of seven layersPhysical Layer : BitsData Link Layer : FramesNetwork Layer : PackagesTransport Layer : SegmentsSeesion Layer()Presentation Layer()Application LayerThe four-layer network model typically refers to the TCP/IP model, which is a simplified and widely used model for understanding and implementing network protocols.Link Layer : FramesNetwork Layer: PackagesTransport Layer: SegmentsApplication Layer: Message/DataGeneral KnowledgeTC... 2023-03-11 2023年03月11日 0 阅读 0 评论
2023-03-09 工厂模式 工厂模式 typedef enum productType { TypeA, TypeB, TypeC } productTypeTag; class Product { public: virtual void show() = 0; virtual ~Product() = 0; }; class ProductA :public Product { public: void show() { cout << "ProductA" << endl; } ~ProductA() { cout << "~ProductA" << endl; } }; class ProductB :public Product { public: void show() { cout << "ProductB" << endl; } ... 2023-03-09 2023年03月09日 0 阅读 0 评论
2023-03-07 Xcode中lldb调试问题 Xcode中lldb调试问题 函数重载不同(lldb) expression -- msg.rfind(' ')error: expression failed to parse:error: :1:5: no matching member function for call to 'rfind'msg.rfind(' ')note: candidate function not viable: requires 2 arguments, but 1 was provided代码中使用的代码int pos = msg.rfind(" ") +1; size_t rfind(char ch, size_t pos = npos) const;上面代码传入了第二个默认参数函数 size_t rfind(char ch, size_t pos = npos) const; 是 C++ 标准库中 std::string 类的一个成员函数。这个函数用于查找指定字符 ch 在字符串中最后一次出现的位置,从字符串的一个指定位置 pos 开始向字符串开始方向搜索。下面详细解释这个函数的各个部分:函数组... 2023-03-07 2023年03月07日 0 阅读 0 评论
2023-02-24 c++变量初始化 c++变量初始化 在C++中,全局变量和静态变量(包括静态局部变量和静态全局变量)的初始化行为需要更精确地区分和理解。这里是详细说明:全局变量和静态全局变量的初始化全局变量和静态全局变量在程序启动时,即进入main函数之前被初始化。这种初始化是按照它们定义的顺序进行的,但这个顺序只在同一个编译单元(通常是一个源文件)内是确定的。跨编译单元的初始化顺序是未定义的。这意味着,如果一个全局变量依赖于另一个编译单元中全局变量的值,那么这种依赖关系是危险的,因为你不能保证两者的初始化顺序。静态局部变量的初始化静态局部变量则是在它们首次用到时才初始化,这一点是正确的。这通常指的是第一次执行到包含该静态局部变量的代码块时。C++11标准确保了这种初始化是线程安全的。动态初始化和静态初始化静态初始化:对于某些情况,编译器可以在编译时期完成初始化(如直接用常量初始化的静态存储期变量)。动态初始化:如果变量的初始化依赖于运行时计算的结果,则其初始化为动态初始化,发生在程序启动阶段(对于非局部静态存储期变量)或者首次使用该变量时(对于局部静态变量)。示例#include <iostream> int gl... 2023-02-24 2023年02月24日 0 阅读 0 评论
2023-02-17 C++中的回调函数 C++中的回调函数 在C++中使用libevent这类C库时,确实需要注意如何正确地将回调函数与对象实例相关联。这是因为C++的成员函数与普通的C函数有所不同,主要因为成员函数隐含了一个指向对象实例的this指针,而C函数不包括这样的指针。这个区别导致在C库(如libevent)中不能直接使用非静态成员函数作为回调。解释一下为什么需要静态声明,并且为何回调不放在类内部:非静态成员函数的特点:非静态成员函数隐式地包含一个指向其所属对象的this指针作为其第一个参数。因此,成员函数的签名与C风格函数指针要求的签名不匹配。静态成员函数:静态成员函数不包含this指针,它的函数签名与普通的C函数相同。因此,可以用作兼容C库的回调函数。静态成员函数能够直接被调用,不需要对象实例,这使得它们适合用作需要C函数指针的场合。将对象实例传递给静态回调函数:虽然静态函数不能直接访问类的非静态成员,但你可以通过将对象实例作为回调的一个参数(通常是通过void*类型的参数传递)来间接访问这些成员。在Notify_cb的实现中,arg参数就是用来传递XThread对象的实例的,这使得回调函数能够访问类的实例和其成员。不在类内... 2023-02-17 2023年02月17日 0 阅读 0 评论
2023-02-10 const 成员函数 const 成员函数 在C++中,const成员函数是指那些在其声明末尾加上const关键字的成员函数。这个const关键字告诉编译器,这个成员函数不会修改类的任何成员变量(除了那些被声明为mutable的变量)。这意味着,你可以在一个常量对象上调用这样的函数,同时也提供了对函数行为的一个重要保证:调用该函数不会改变对象的状态。示例考虑下面这个简单的类,它代表了一个几何中的点:class Point { private: double x, y; // 坐标 public: Point(double x, double y) : x(x), y(y) {} // const成员函数,不会修改任何成员变量 double getX() const { return x; } double getY() const { return y; } // 非const成员函数,可以修改成员变量 void setX(double newX) { x = newX; } void setY(double newY) { y = newY; } };... 2023-02-10 2023年02月10日 0 阅读 0 评论