- 博客(63)
- 资源 (5)
- 收藏
- 关注
原创 渗透测试 - 信息收集
二级目录: baidu.com/upload/ baidu.com/upload/?根目录: baidu.com/test.php test.text。在网站传参的地方比方说 id=?然后一般会跳出来提示。
2025-02-09 00:35:39
326
原创 C/C++ 面试智能指针
);std::unique_ptr 不能被拷贝,因为它遵循独占所有权的语义。可以通过 std::move 转移所有权,转移后原指针变为 nullptr。这种设计确保了资源管理的安全性和明确性,避免了内存泄漏和重复释放的问题。特性unique_ptrshared_ptr所有权独占所有权,不能共享共享所有权,多个指针可以指向同一资源拷贝不允许拷贝,只能转移所有权 (std::move)支持拷贝,引用计数增加内存管理资源的释放由 unique_ptr 自动进行。
2025-02-07 15:44:50
1183
2
原创 23.解释器模式( Interpreter Pattern)
解释器模式(Interpreter Pattern) 是一种行为型设计模式,它提供了一个解释语言的方式。该模式用于处理一个特定语言的语法规则,通过一个解释器(通常是一个类或一组类)来解释和执行该语言的语法。解释器模式通常用于实现一个简单的编程语言、脚本语言或表达式求值。// 抽象表达式接口public:// 解释方法,返回计算结果Expression 是所有表达式的抽象接口,声明了 interpret() 方法,该方法将执行表达式的解释(计算)。
2025-02-06 15:32:34
976
原创 22. 访问者模式(Visitor Pattern)
访问者模式(Visitor Pattern) 是一种行为型设计模式,它允许你在不修改元素类的前提下,添加新的操作。访问者模式通过将操作封装在访问者对象中,从而使得你可以为不同类型的元素执行不同的操作,而不需要改变元素类的代码。// 访问者接口public:ShapeVisitor 是访问者接口,声明了访问不同元素的方法。每个具体访问者会实现这些方法,针对不同的图形执行不同的操作。// 元素接口public:// 接受访问者。
2025-02-06 15:23:12
680
原创 21.命令模式(Command Pattern)
命令模式(Command Pattern) 是一种行为型设计模式,它将请求封装成一个对象,从而使您可以使用不同的请求、队列、日志请求以及支持撤销操作等功能。命令模式通过将请求(命令)封装成对象,使得客户端可以将请求发送者与请求接收者解耦,从而更灵活地控制操作的执行。// 命令接口public:// 执行命令的接口Command 是命令接口,声明了 execute() 方法,该方法将由具体命令类来实现。
2025-02-06 15:14:21
878
原创 20.责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 是一种行为型设计模式,它使得多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将多个处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。每个对象在处理请求时,可以决定将请求传递给链中的下一个对象。// 处理者接口protected:// 下一个处理者public:// 设置下一个处理者// 处理请求。
2025-02-06 14:55:40
1065
原创 19.迭代器模式(Iterator Pattern)
迭代器模式(Iterator Pattern) 是一种行为型设计模式,它提供了一种方法,使得可以顺序访问一个集合对象中的元素,而无需暴露集合对象的内部结构。通过迭代器模式,客户端可以通过统一的接口遍历容器中的元素,无论容器的具体实现如何。// 迭代器接口public:// 判断是否还有下一个元素// 获取下一个元素Iterator 是迭代器接口,定义了遍历集合的两个关键方法:hasNext() 和 next()。public:// 创建迭代器。
2025-02-06 14:42:42
867
原创 1.8 组合模式(Composite Pattern)
组合模式(Composite Pattern) 是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式让客户端可以以相同的方式对待单个对象和对象集合。组合模式使得客户可以统一处理树形结构中的单个对象和对象的集合,简化了对象的使用和管理。// 组件接口:部门和员工的共同接口public:// 显示信息IComponent 是所有部门和员工的公共接口,声明了 showInfo() 方法,用于展示信息。
2025-02-06 11:50:03
1085
原创 1.7 备忘录模式(Memento Pattern)
备忘录模式(Memento Pattern) 是一种行为型设计模式,允许在不暴露对象实现细节的情况下,保存和恢复对象的状态。备忘录模式的核心思想是将对象的状态保存到一个外部对象(备忘录)中,这样对象可以随时恢复到先前的状态。通过备忘录模式,可以实现对象状态的回滚,例如撤销操作等。// 备忘录类:用于存储文本编辑器的状态private:// 存储文本状态public:// 获取存储的状态Memento 类是备忘录模式的核心,它封装了文本编辑器的状态。
2025-02-06 11:28:49
984
原创 16.状态模式(State Pattern)
状态模式(State Pattern) 是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。也就是说,状态模式通过封装对象的状态,使得对象在不同的状态下表现出不同的行为,状态的切换由状态对象来控制。// 状态接口public:// 定义投票方法VoteState 是状态接口,定义了 vote() 方法,表示在不同状态下的投票行为。
2025-02-06 11:10:27
1512
原创 1.5 中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 是一种行为型设计模式,旨在通过引入一个中介者对象来简化类与类之间的交互。在这个模式中,各个对象之间不直接交互,而是通过中介者对象来协调它们之间的通信。这样可以避免多个对象之间直接相互依赖,从而降低了系统的复杂度和耦合度。// 中介者接口public:IChatRoom 是中介者接口,定义了所有同事对象与中介者交互的方式。它有两个主要的方法:sendMessage():用于发送消息。addUser():用于添加用户。
2025-02-06 10:54:27
631
原创 14.适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一种接口。适配器模式通常用于将已有的类或遗留系统中的接口与新系统或目标接口进行兼容,从而能够在系统中无缝地使用不兼容的类。解耦:客户端与旧接口解耦,客户端通过目标接口与适配器交互,不直接与遗留系统进行交互。复用:适配器模式可以使旧系统或类重用,而不需要修改旧代码。适应性强:代理类可以灵活适应不同的接口需求,尤其在接口不兼容时尤为有用。
2025-02-06 10:39:31
722
原创 13.代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 是一种结构型设计模式,它通过提供一个代理对象来控制对目标对象的访问。代理对象作为客户端与目标对象之间的中介,间接地访问目标对象的功能。代理模式可以在不改变目标对象的情况下增加一些额外的功能,如延迟加载、安全控制、日志记录等。代理模式通过引入代理类,允许客户端通过代理间接访问目标对象,并能在不改变目标对象的情况下,增加一些额外的功能,如延迟加载、访问控制、日志记录等。代理模式能有效地解耦客户端和目标对象,简化客户端与目标对象之间的交互,同时增加系统的灵活性。
2025-02-05 20:39:31
948
原创 12.外观模式(Facade Pattern)
外观模式(Facade Pattern) 是一种结构型设计模式,它通过为复杂的子系统提供一个统一的接口,使得子系统的使用更加简化。外观模式通常隐藏了复杂的内部子系统,使得客户端可以通过一个简单的接口与这些子系统进行交互。简化接口:将复杂子系统的接口进行封装,提供统一的简单接口。解耦:客户端不再与子系统的多个组件交互,只与外观类交互,减少了系统之间的耦合。提高可维护性:外观模式通过将子系统的复杂性隐藏在外观类中,使得系统的维护更加容易增加了外观类的复杂性。
2025-02-05 19:32:11
615
原创 11.享元模式 (Flyweight)
Flyweight 模式(享元模式) 是一种结构型设计模式,它旨在通过共享对象来有效支持大量细粒度对象的复用。该模式主要通过共享细节来减少内存使用,提升性能,尤其在需要大量对象时非常有效。角色 描述Font 享元类,存储共享的字体内部状态。FontFactory 享元工厂,管理字体实例的池并保证字体复用。Client 客户端,使用 FontFactory 获取字体并设置外部状态。Flyweight 模式的优点:节省内存:多个相同对象共享相同的内部状态,只存储一份,减少内存占用。
2025-02-05 19:03:26
749
原创 10.单例模式 (Singleton Pattern)
单例模式(Singleton Pattern) 是一种创建型设计模式,确保一个类在整个程序生命周期中只能有一个实例,并提供一个全局访问点。方式线程安全实现复杂度适用场景传统懒汉式× 否简单仅限单线程DCLP(双重检查锁定)√ 是复杂C++11 之前的多线程√ 是较复杂需要高性能√ 是简单现代 C++ 推荐局部静态变量√ 是最简单C++11 推荐Singleton模式中的实力构造器可以设置为protected以允许子类派生。
2025-02-05 17:21:01
950
原创 9.建造者模式 (Builder Pattern)
建造者模式(Builder Pattern)是一种创建型设计模式,旨在将复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。该模式的核心思想是通过一步步地构建一个复杂的对象,每个步骤独立且可扩展,并且最终的产品(对象)可以通过不同的构建步骤得到不同的结果。建造者模式通过分离复杂对象的构建过程和对象的表示,使得构建过程更加灵活,支持多种对象表示方式。在实际开发中,当对象的构建过程繁琐且有多个可选的组成部分时,建造者模式是一种非常有效的设计模式。
2025-02-05 16:47:07
850
原创 8.原型模式(Prototype)
使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。什么时候使用原型,什么时候使用工厂最大的区分点就在于:用工厂方法创建对象是不是非常简单的几个步骤就可以把这个对象创建出来,还是说需要考虑对象很复杂的中间状态,然后又很希望保留这个中间状态,如果是后者的话就用原型。Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有稳定的接口。
2025-02-02 16:58:30
455
原创 4.装饰模式(Decorator)
这里可以看到 我们在 MemoryStream* stream;都是某个类型的子类的时候,之间声明成某个类型。,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。在软件组件设计中,如果责任划分不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。这里可以看到 加密的操作都是相同的,但是读取的方式是不同的。那么我们发现,可以合并这个类。
2025-01-30 16:50:43
416
原创 6.工厂模式(Factory Method)
通过“对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。
2025-01-30 13:15:49
480
原创 5.桥模式(Bridge)
Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自纬度的变化,即“子类化”它们。Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。
2025-01-30 11:15:49
455
原创 3.观察者模式(Observer)
使用面向对象的抽象,Observer 模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达到松耦合目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知,目标对象对此一无所知。Observer 模式是基于事件的UI框架中非常常用的设计模式,也是MVC模式的一个重要组成部分。
2025-01-28 12:09:33
1180
原创 2.策略模式(Strategy)
定义一系列算法,把它们一个个封装起来,并且使他们可互相替换(变化)。该模式使算法可独立于使用它的客户程序(稳定)而变化(拓展,子类化Strategy 及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。Strategy 模式提供了用条件判断语句之外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要 Strategy 模式。
2025-01-27 22:29:29
1209
原创 1.Template Method 模式
在这里 什么时候、什么地点应用设计模式,比理解设计模式结构代码本身更加重要。现在软件设计的特征是 “需求的频繁变化”。
2025-01-26 01:46:54
596
原创 C++ 设计模式
对 MainForm 的设计,删除 lineVector 和 rectVector 只需要设计 vector 的 Shape 就可以应对所有形状。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。人们面对复杂性有一个常见的做法:既分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。首先设置一个 Shape(形状)的父类,设置一个纯虚函数Draw,和一个虚析构函数。在这里只有虚析构函数子类通过多态释放的时候,子类的虚析构函数才会被正确的调用到。
2025-01-25 21:09:19
850
原创 C++ 继承和多态
继承是一种面向对象编程的重要特性,它允许你创建一个新的类,从一个或多个现有的类中继承属性的行为。这个新的类被称为 派生类(Derived Class),而被继承的类称之为基类(Base Class)。继承所研究的是类与类之间的依赖关系,是多个类直接的共性与个性直接的代码表达。让代码结构更加合理,灵活,易于维护。
2025-01-23 15:49:19
280
原创 C/C++ 虚函数
虚函数是指在基类内部声明的成员函数前面添加关键字 virtual指明的函数虚函数存在的意义是为了实现多态,让派生类能够重写(override)其基类的成员函数派生类重写基类的虚函数时,可以添加 virtual 关键字,但不是必须这么做虚函数是动态绑定的,在运行时才确定,而非虚函数的调用在编译时确定虚函数必须是非静态成员函数,因为静态成员函数需要在编译时确定构造函数不能是虚函数,因为虚函数是动态绑定的,构造函数创建时需要确定对象关系。析构函数一般是虚函数。
2025-01-22 11:58:14
231
原创 C++ 类- 构造和析构
答:需要看是否符合位拷贝语义,如果不符合我们的位拷贝语义将会生成默认的拷贝构造函数,如果符合位拷贝语义的话,就不会生成默认的拷贝构造函数。虚函数是c++ 提供多态的特性,这里的多态是通过虚函数表指针,在对象构建的时候需要正确的设置虚函数表指针,所以编译器会为它生成一个默认的构造函数。由于我们构建派生类的时候需要先构基类,基类有一个默认拷贝构造函数,所以在子类中编译器帮我们生成了一个默认拷贝构造函数用来调用基类的默认拷贝构造函数。在单继承当中,如果有成员类,会按照声明顺序进行构造,按照相反顺序进行析构。
2025-01-21 17:22:57
774
原创 C/C++ 时间复杂度(On)
在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。将数字从 1~100 进行排序不同的人用不同的方法写出的程序都会有所偏差,这就需要我们对编写这个算法有一定的预期,了解这部分算法的运行效果,如果运行效果不适用,就没必要使用这个算法。
2025-01-20 16:58:28
360
原创 c/c++ 结构体大小计算
sizeof是编译时的操作符,它用来计算数据类型或者对象所占用的大小(以字节为单位),它在编译时计算,不再运行时消耗资源。strlen是c语言库函数,用于计算字符串的长度,返回的是字符串中字符的数量(不包括结束符‘\0’)测一测:a=10,b=20a:strlen(str)返回的是字符串“0123456789”的长度,不包括结尾的‘\0’,因此是10。b:sizeof(str)计算的是指针str的大小,而不是它指向的字符串大小,通常在64位系统上是8字节。
2025-01-20 13:53:20
856
原创 inline 内联函数
如第三节说的C++中在类内定义的所有函数都自动称为内联函数,类的成员函数的定义直接写在类的声明中时,不需要inline关键字。不过对汇编观察没有明显变化。
2025-01-20 10:04:02
284
原创 c/c++ 左值右值
定义:就是必须绑定到右值的引用,它可以指向右值,不能指向左值。C++11中右值引用可以实现“移动语义”,通过&&获得右值引用。结论:右值引用类型只是用于匹配右值,而并非表示一个右值。因此,尽量不要声明右值引用类型的变量,而只在函数形参使用它以匹配右值。引用的本质是别名,可以通过引用改变变量的值,传参时传引用可以避免拷贝。左值和右值主要的区别之一是左值可以被修改,而右值不能。count是左值引用,count引用number。number是左值,10是右值。错误:右值引用不能直接绑定左值。
2025-01-18 11:56:52
283
原创 c/c++ const
如果当前函数是一个打印函数,只负责打印参数内容,怕程序员不小心修改函数参数,那么就可以在参数上加const防止参数number被修改。constint&number是一个引用常量,不占用额外内存,仅作为引用使用。它无法通过引用修改对象,但是可以直接修改原对象的值。constintnumber占用内存,用于储存常量值,它不可以被修改,值是固定不变的。自身是常量的指针(常量指针,constpointer)3.修饰指针,表示该指针本身是常量,不能指向别的位置。
2025-01-16 11:54:06
299
原创 C++ 32位程序,在内存中保存64位数字
编写shellcode 的时候存了下需要内存加载的 文件大小,这个文件大小是 uint64_t 的,直接保存可能会出错。
2024-11-07 12:00:18
166
cocos2d-lua 3x 基础概念(包括场景、导演、在屏幕上显示自定义对象等)代码
2022-05-19
cocos2d-x lua 3.10 消除水果源码和资源
2022-05-19
第二单元作业:词法分析器作业
2020-04-22
小型编译器例子小型的从表达式语言Sum到栈计算机Stack的编译器
2020-04-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人