C++
文章平均质量分 57
smallerxuan
这个作者很懒,什么都没留下…
展开
-
C++11的内联命名空间(inline namespace)
在c++11后 一个namespace (子命名空间)可以通过inline 修饰,将其中的函数和类型export到其外层的namespace(父命名空间)中,并且这种export是可以传递的。原创 2022-05-09 00:33:51 · 1136 阅读 · 0 评论 -
《设计模式》学习笔记——迭代器模式
迭代器模式(Iterator Pattern)用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。迭代器模式属于行为型模式。IteratorPattern.h#pragma once#include<iostream>#include<string>// 模拟对象typedef int Object;#define SIZE 5...原创 2018-10-29 08:21:04 · 4525 阅读 · 0 评论 -
《设计模式》学习笔记——备忘录模式
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。主要解决: 所谓备忘录模式就是在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 这样可以在以后将对象恢复到原先保存的状态。何时使用...原创 2018-10-29 08:03:53 · 1334 阅读 · 0 评论 -
《设计模式》学习笔记——观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。用于定义对象间一对多的关系意图: 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决: 一个对象状态改变给其他对象通知的问题,而且要考虑到易用和...原创 2018-10-29 07:58:28 · 1874 阅读 · 0 评论 -
《设计模式》学习笔记——概述
一、起源 在 1994 年,《Design Patterns - Elements of Reusable Object-Oriented Software》这本由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著的书出版了,在这本书中首次提出了软件开发中设计模式的概念。二、基本原则对接口编程而不是对...原创 2018-10-24 01:42:42 · 584 阅读 · 0 评论 -
《设计模式》学习笔记——写在前面
在这个深夜里,我这会儿思考着的是我的坚持,5年内坚持基础理论的学习,这是我从大学伊始便下定的决心,这很难坚持,不在于技术本身,而在于本心。因为当你看见很多人在使用着快捷、高效的方式开发一个个产品,通过有益的代码复用加快开发进度的时候,你很难再安心于学习这些基础理论知识。因为即便不深入的理解,亦能良好的使用。可是这和我追求本真,谋求改变的心是一致的么? ...原创 2018-10-24 01:17:53 · 572 阅读 · 0 评论 -
《设计模式》学习笔记——中介者模式
中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。主要解决: 对象与对象之间存在大...原创 2018-10-29 07:51:38 · 1890 阅读 · 0 评论 -
《设计模式》学习笔记——策略模式
策略模式(Strategy Pattern)是指有一定行动内容的相对稳定的策略名称。一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。意图: 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。...原创 2018-10-28 08:44:11 · 4888 阅读 · 0 评论 -
《设计模式》学习笔记——责任链模式
责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链,这种模式给予请求的类型,对请求的发送者和接收者进行解耦,属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。意图: 避免请求发送者与接收者耦合在一起,让多个对象都有可能...原创 2018-10-28 08:38:57 · 9204 阅读 · 0 评论 -
《设计模式》学习笔记——命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。 请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。意图: 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。主要解决: 在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系....原创 2018-10-28 08:32:20 · 4050 阅读 · 0 评论 -
《设计模式》学习笔记——模板模式
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。主要解决: 一些方法通用,却在每一个子类都重新写了这一...原创 2018-10-28 08:28:12 · 1735 阅读 · 0 评论 -
《设计模式》学习笔记——状态模式
在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。意图: 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。主要解决: 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关...原创 2018-10-29 08:12:31 · 10162 阅读 · 0 评论 -
《设计模式》学习笔记——解释器模式
解释器模式(Interpreter Pattern)提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。意图: 给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。主要解决: 对于一些固定文法构建一个解释句子的解释器。何...原创 2018-10-29 08:17:32 · 3898 阅读 · 0 评论 -
《设计模式》学习笔记——代理模式
代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式的角色组成: 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。 代理角色 : 实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附...原创 2018-10-25 05:59:01 · 1129 阅读 · 0 评论 -
《设计模式》学习笔记——原型模式
原型模式(Prototype)是一种创建型设计模式。原型模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。工作原理: 通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。使用场景是:让一个复杂的对象拥有自我复制功能,统一一套接口值得注意的是:克隆方法一定要注意深拷贝浅拷贝问题 Prototype.h...原创 2018-10-25 05:58:50 · 1586 阅读 · 0 评论 -
《设计模式》学习笔记——建造者模式
建造者(生成器)模式(Builder)是用于将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。在建造者模式中主要拥有以下角色: Builder: 为创建产品各个部分,统一抽象接口 CouncreteBuilder: 具体的创建产品的各个部分 Director: 构造一个使用Builder接口的对象 ...原创 2018-10-25 05:58:36 · 3205 阅读 · 0 评论 -
《设计模式》学习笔记——抽象工厂模式
抽象工厂模式(AbstractFactory)和工厂模式的区别在于抽象工厂可以生产一个产品族。抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。 AbstractFactory.h#pragma once#include<iostream>#include<string>c...原创 2018-10-24 09:50:29 · 4466 阅读 · 2 评论 -
《设计模式》学习笔记——工厂模式
工厂模式(FactoryPattern)与简单工厂模式相比较,最大的不同在于对工厂本身做了一层抽象,工厂实例通过抽象工厂来产生。在这种模式下,可以产生不同的工厂,不同的工厂又能够生产不同的产品。 FactoryPattern.h#pragma once#include<iostream>#include<string>class Fruit ...原创 2018-10-24 09:44:49 · 1699 阅读 · 0 评论 -
《设计模式》学习笔记——静态工厂模式
静态工厂模式(StaticFactoryMethod)又叫做简单工厂模式,属于创建型模式但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是普通工厂模式的一个特殊实现。以下代码以静态水果工厂为例进行举例说明:StaticFactoryMethod.h#pragma once#i...原创 2018-10-24 09:27:10 · 2734 阅读 · 0 评论 -
《设计模式》学习笔记——单例模式
单例模式(SingletonPattern)是一种对象创建模型,使用单例模式可以保证一个类只生成一个对象实例,即在整个程序的生命周期内,该类的实例对象只存在一个。单例模式(SingletonPattern)保证一个类只有一个实例存在,同时提供能对该实例加以访问的全局访问方法。实现单例模式的常用步骤: 1、构造函数私有化 2、提供一个全局的静态方法(全局访问点...原创 2018-10-24 09:14:59 · 3936 阅读 · 0 评论 -
《设计模式》学习笔记——依赖倒转原则
依赖倒转原则强调针对接口编程,依赖于抽象而不依赖于具体。也就是说高层模块不应该依赖于低层模块,而是二者都应该依赖于抽象接口层。依赖倒转原则的目的在于把高层次组件和低层次组件解耦,高层次组件依赖于接口层实现,低层次组件也依赖于接口层实现,通过这种方式以谋求重用不同的低层组件的实现。以下的代码案例以组装电脑这一场景进行举例说明:Computer.h#pragma once#incl...原创 2018-10-24 08:55:54 · 607 阅读 · 0 评论 -
《设计模式》学习笔记——开闭原则
开闭原则(Open Close Principle)的关键在于对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是增加新的代码。使程序的扩展性好,易于维护和升级。接口和抽象类的使用能达到这种效果。以下的代码通过模拟一个银行存钱业务,来进行举例说明:BankWorker.h#pragma once#include<iostream>#includ...原创 2018-10-24 08:15:51 · 1644 阅读 · 0 评论 -
《设计模式》学习笔记——享元模式
享元模式(Flyweight Pattern)是一种软件设计模式。 它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。享元模式通过共享的方式,高效的支持大量的细粒度的操作。 FlyweightPa...原创 2018-10-28 08:04:54 · 6585 阅读 · 0 评论 -
《设计模式》学习笔记——外观模式
外观模式(Facade Pattern),亦称"过程模式"。外观模式为一组具有类似功能的类群,比如类库,子系统等,提供一个一致的简单的界面。这个简单的界面被称之为facade。适用于:为子系统统一一套接口,使子系统更加容易使用。 Facade.h#pragma once#include<iostream>#include<string>// 子系统...原创 2018-10-28 08:00:26 · 3511 阅读 · 0 评论 -
《设计模式》学习笔记——组合模式
组合模式(Composite Pattern)将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 "部分/整体" 还有 "单个对象" 与 "组合对象" 的含义。组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。CompositePattern.h#pragma once...原创 2018-10-28 07:55:43 · 2204 阅读 · 0 评论 -
while((c= getchar()) != EOF)的隐藏问题
while((c= getchar()) != EOF)的隐藏问题 曾今写过这样的代码:char c;while((c= getchar()) != EOF){ Do……}用以读取文本中的数据,曾一直以为这段代码应该是正确的,从语法到逻辑上看起来它都应该是正确的,但其实不然,因为这尽在逻辑层面是正确的,但结合底层实现来思考,它是存在问题的,而且问题很大。 先分析库函数getchar(),...原创 2018-02-08 11:53:26 · 557 阅读 · 0 评论 -
C++中的this指针
C++中的this指针 在C++中指针this有着极其重要的作用,但却又把自己隐藏起来,默默付出的存在,不显山,不露水,深藏功与名。在C++的类中实际上到处都有this的身影(实际上在现在的编程语言中不乏类似的存在,例如:Python中的self),从成员变量到成员函数到参数列表(是的,连参数列表中它都存在,只是它在这里是以隐藏参数的身份存在的),每一个角落它都存在,而且都发原创 2017-12-05 21:19:11 · 177 阅读 · 0 评论 -
C++学习日记(1)
C++学习日记(1)——写在前面 终于再次回到C++,虽然之前已经学习过,但总是感觉有所欠缺,感觉基础不扎实,没有如指臂使得那种感觉,所以想再次回过头来从新在走一遍。但日常的学习与工作是繁忙的,这个再次学习的过程或许真的会很漫长吧。原创 2017-11-23 07:44:24 · 158 阅读 · 0 评论 -
C++与C混合编程中的extern "C"
C++与C混合编程中的extern "C"在我们使用C++为主体,混合使用C语言进行编程的时候,对于初学者而言最常遇见的一个问题是在编译的过程中,无法连接到目标函数。这是为什么呢?这我们就需要知道另一件事情,C++支持函数重载。C++的函数重载究竟是如何实现的呢?其实在C++源码中的函数名称并非是编译后的名称,实际上这种处理是编译器做的,隐蔽而又常被人们忽略。C原创 2017-08-24 10:50:13 · 288 阅读 · 0 评论 -
简单了解C++11后对多线程的支持
简单了解C++11后对多线程的支持在C++11之前,C++的多线程需要系统支持,不同的系统下需要调用不同的系统API。但在C++11之后增加了、、、等头文件,支持了多线程。例如:#include #include void function_1(){ std::cout }void function_2(){ std::cout原创 2017-08-18 07:47:24 · 244 阅读 · 0 评论 -
关于hash table的简单了解
关于hash table的简单了解hash table是一种可以提供对任何有名项的存取、删除操作的技术。它的操作对象是有名项,所以是一种dictionary(字典结构)。通过该技术可以使得对元素集的基本操作的时间达到常量级。hashtable的关键在于映射函数hash function(哈希散列函数)能够实现有名项的个体差异转换为映射值的不同,并且保持该序列(即索引)的大小是可接受原创 2017-08-18 07:45:15 · 301 阅读 · 0 评论 -
函数指针、仿函数、Lambda表达式在同一场景下的使用示例
函数指针、仿函数、Lambda表达式在同一场景下的使用示例函数指针(function pointer):指向函数的指针变量。仿函数(functors/function objects):可以称之为具有函数特性的对象。Lambda表达式(Lambda expressions):在被调用位置或者作为参数传递给函数的位置,定义匿名函数对象的方法。三者在规则性排序场景下的使用举例:原创 2017-08-18 07:40:47 · 651 阅读 · 0 评论 -
浅谈C++11(C++2.0)初始化列表
浅谈C++11(C++2.0)初始化列表学过C++,我们知道对于C++,由于前向语法的支持,C++支持多种变量初始化的方式。例如: int a = 10; float b ={2.5}; double c (3.145); vector {1,9,3,4};他们在语法上都是没有问题的,但语法上却并不具有一致性,虽然他们做的工作是一致的。于是在C++11(即C++2.0)原创 2017-08-18 07:35:08 · 211 阅读 · 0 评论 -
void main()正确么?
void main()正确么? void main()正确么?这个提问有些让人摸不着头脑的样子,但这的确值得思考。见过很多种的main()函数风格,例如:void main(void)、int main(void)、int main(int argc, char** argv )、int main(int argc, char* argv[] )、int main(int argc, char* ...原创 2018-02-08 11:55:13 · 1772 阅读 · 0 评论 -
MFC下双缓冲绘图的简单实现
MFC下双缓冲绘图的简单实现 在窗口DC上进行绘图,简单直接的做法就是直接调用GDI绘图函数进行绘图操作。当需要绘制新的图形时,就利用画刷刷去旧有的图形,然后再次调用GDI绘图。这种简单、朴素的绘图方法在简单场景下能够胜任简单的绘图任务,但当需要绘制复杂图形例如位图或者绘图量操作很大的时候就不能够胜任了,会产生闪屏现象。所以就有了双缓冲绘图,双缓冲绘图指的是:不简单的使用画刷去刷新D...原创 2018-02-28 09:42:47 · 7086 阅读 · 1 评论 -
蓝桥杯解题(一)打印十字图 时间限制:1.0s 内存限制:256.0MB
原题描述:历届试题 打印十字图 时间限制:1.0s 内存限制:256.0MB锦囊1使用二维数组。锦囊2使用二维数组把图形保存下来,然后再输出。问题描述小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。输入格式一个正整数 n (n<30) 表示要求打印图形的层数。输出格式对应包围层数的该标志。样例输入...原创 2018-03-09 14:01:28 · 5581 阅读 · 3 评论 -
《设计模式》学习笔记——桥接模式
Bridge Pattern被称之为桥接模式,属于构造型模式。Bridge Pattern基于类的最小设计原则,通过使用封装、聚和以及继承等行为来让不同的类承担不同的责任。它的主要特点是把抽象类与行为实现分离开来,从而可以保持各个部分的独立性以及对应它们的功能扩展 。Brige.h#pragma once#include<iostream>#include<stri...原创 2018-10-28 07:51:31 · 1590 阅读 · 0 评论 -
《设计模式》学习笔记——适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。 将一个类的接口转换成另一个类的接口,使原本因为接口不兼容的类能够相互工作。 这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。AdapterPattern.h#pragma once#include<iostream>...原创 2018-10-28 07:46:27 · 3696 阅读 · 0 评论 -
《设计模式》学习笔记——装饰模式
装饰模式(Decorator Pattern)指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象。DecoratorPattern.h#pragma once#include<iostream>#include<string>class Car{public: virtual ...原创 2018-10-28 07:42:05 · 5896 阅读 · 0 评论 -
使用宏定义方便切换使用ASCII编码和Unicode编码
使用宏定义方便切换使用ASCII编码和Unicode编码 在使用VS环境进行VC编程的时候,有时候我们会被要求建立两个版本的程序,一个处理ASCII编码的字符数据,一个处理Unicode编码的字符数据,难道我们必须写两套代码用以处理么?其实更好的选择是编写一套代码,但使它们能够编译成两个版本。通常的做法是定义一个条件宏:#ifdef _U...原创 2018-08-24 16:03:10 · 1135 阅读 · 0 评论