
C/C++设计模式
文章平均质量分 60
C/C++设计模式,给出设计模式的示例,与github上进行同步
Achilles.Wang
勿在浮沙筑高台
展开
-
C++内存模型和原子类型操作
C++内存模型和原子类型操作std::memory_order初探动态内存模型可以理解为存储一致性模型,主要是从行为上来看多个线程对同一个对象读写操作时所做的约束,动态内存理解起来会有少许复杂,涉及到内存、Cache、CPU的各个层次的交互。如下有两个线程,分别对a、R1、b、R2进行赋值,根据线程执行的顺序可能有以下几种情况在不对线程进行任何限制,线程内部指令不进行重排的情况下。可以有4!/(2!*2!)=6中情况在不考虑优化和指令重排的情况下,多线程有如下两种情况:程序最终执行的结果,是原创 2021-08-15 21:06:23 · 573 阅读 · 0 评论 -
万字长文带你一文读完Effective C++
Effective C++视C++为一个语言联邦STL Template C++ C Object-oriented C++一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更加无拘无束,接受不同于C with classes的各种观念、特性和编程战略。异常对函数的结构化带来了不同的做法,templates将我们带来到新的设计思考方式,STL则定义了一个前所未见的伸展性做法。今天C++已经是个多重范型编程语言,一个同时支持过程形式、面向对象形式、函数形式、泛型形式、元编程形式原创 2021-08-10 20:15:40 · 1223 阅读 · 0 评论 -
最简单的方式实现一棵二叉树
使用最简单的方式实现看树写代码C++实现这段代码之所以能够正常工作,是因为数组元素的地址是常量表达式。我们可以使用这种标记法定义任何链式结构,但是这种初始化方法难以记住,所以在构建这种结构时很容易出现编码错误。//// Created by andrew on 2021/5/29.//#include <iostream>using namespace std;int main(int argc, char* argv[]) { // 看着图就可以手上写一个二叉树原创 2021-05-29 12:07:51 · 175 阅读 · 0 评论 -
使用malloc初始化一个类和new初始化一个类的区别
new出来对象会调用对象的构造函数,但是malloc出来的对象是没有调用构造函数的,因此下面使用malloc初始化的对象私有变量是没有经过构造函数初始化的但是通过new出来的对象,对象已经经过构造函数的初始化。//// Created by andrew on 2021/3/8.//#include <iostream>#include <string>using namespace std;class MallocClass {private: str原创 2021-03-08 22:40:13 · 2266 阅读 · 0 评论 -
23种设计模式C++实现UML+源码汇总
设计模式-汇总代码开源仓库地址23种设计模式C++实现C++中的开闭原则使用C++多态功能实现附源码C++基于多态实现依赖颠倒原则附源码C++ 的静态成员变量为什么一定要在类外定义23种设计模式C++源码与UML实现–单例模式中的饿汉模式和懒汉模式c++中的 单例模式(singleton)和双检测锁(Double-Checked Locking)23种设计模式C++源码与UML实现–简单工厂模式23种设计模式C++源码与UML实现–工厂模式23种设计模式C++源码与UML实现–代理模式原创 2020-11-29 22:36:01 · 1719 阅读 · 2 评论 -
23种设计模式C++源码与UML实现--建造者模式
建造者模式代码仓库地址:建造者模式Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。Builder模式是一种对象创建模式之一,用来隐藏复合对象的创建过程。他把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。对象的创建:Builder模式是为了对象的创建而设计的模式-创建的是一个复合对象,被创建的对象为一个具有复合属性的复合对象,关注对象创建的各个部分的创建过程,不同工厂(Builder)对产品属性有不同的创建方法。Build原创 2020-10-15 00:20:59 · 426 阅读 · 0 评论 -
八大编程知名编程语言或系统的发展简史
知名编程语言或系统的发展简史一、B语言B语言之父:Ken Thompson(肯.汤普森)。B语言是贝尔实验室开发的一种通用的程序设计语言,它是于1969年前后Ken Thompson(肯.汤普森)在Dennis Ritchie丹尼斯.里奇(Dennis Ritchie)的支持下设计出来。该语言得名于汤姆森的妻子Bonnie,它是一门开发于60年代中期的语言,现在使用者已经很少了。二、C语言C语言之父:Dennis Ritchie(丹尼斯·里奇)。美国著名计算机专家、C语言发明人、UNIX之父。在1原创 2020-10-14 22:55:31 · 1961 阅读 · 0 评论 -
23种设计模式C++源码与UML实现--工厂模式
工厂模式工厂方法模式同样属于类的创建型模式,又被称为多态工厂模式。工厂方法的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不在负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处就是使得工厂方法模式可以使系统不再修改具体工厂角色的情况下引进新的产品。模式中包含的角色极其职责抽象工厂角色工厂方法的核心,任何工厂类都必须实现这个接口具体工厂角色具体工厂是抽象工厂的一个实现,负责实例化产品对象。抽象角色工厂方法模原创 2020-10-08 23:32:54 · 565 阅读 · 0 评论 -
23种设计模式C++源码与UML实现--简单工厂模式
简单工程模式简单工厂模式,属于类的创建型模式,又叫做静态工厂方法模式。通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。模式中包含的角色及其职责工厂角色简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂可以被外界直接调用,创建所需的产品对象。抽象角色简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。具体产品角色简单工厂模式所创建的具体实例对象说明:产品和工厂之间的关系是依赖,产品和抽象产品之间的关系是继承。依赖:一个类的对象当另外原创 2020-10-08 22:22:35 · 749 阅读 · 0 评论 -
C++纯虚函数和抽象类
基本概念纯虚函数和抽象类纯虚函数是一个在基类中说明的虚函数,但是在基类中没有定义,要求任何派生类都定义自己的版本纯虚函数为个派生类提供一个公共界面(接口的封装和设计、软件模块功能的划分)纯虚函数定义形式: virtual 类型 函数名(参数表)=0;一个具有纯虚函数的基类称为抽象类抽象类的点:抽象类不能建立对象可以声明抽象类的指针抽象类不能作为函数的返回类型抽象类不能作为函数的参数可以声明抽象类的引用绝大多数面向对象语言都不支持多继承绝大多数面向对象语言都支持接口的概念原创 2020-09-26 23:32:03 · 166 阅读 · 0 评论 -
C++多态
C/C++是静态编译语言。在编译时,编译器自动根据指针的类型判断执行的是一个什么样的对象在编译此函数的时候,编译器可能不知道指针究竟指向了什么编译器没有理由报错于是,编译器认为安全的做法是编译到父类的print函数,因为父类和子类肯定都有相同的print函数如下:#include <iostream>using namespace std;class Parent{public: Parent(int a) { this->a = a; cout&l原创 2020-09-26 22:14:57 · 328 阅读 · 0 评论 -
C++中的虚继承
如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的名字进行访问时,可能产生二义性如果在多条继承路径上有一个公共的基类,那么在继承路径的某处汇合点,这个公共基类就会在派生类的对象中产生多个基类子对象#include <iostream>using namespace std;class B{private: /* data */原创 2020-09-26 00:17:48 · 253 阅读 · 0 评论 -
C++继承中的同名成员变量处理方法
1、当子类成员变量与父类成员变量同名时2、子类依然从父类继承同名成员3、在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)4、同名成员存储在内存中的不同位置#include <iostream>using namespace std;class A{public: int a; int b;public: void get() { cout<<"b "<<b<<endl;原创 2020-09-24 23:34:40 · 2278 阅读 · 1 评论 -
Libevent-网络服务器事件示例
网络服务器事件示例原创 2020-07-17 00:30:56 · 257 阅读 · 0 评论 -
一文读懂UPNP-UPNP超详细介绍
UPNP report| | | | _ \| \ | | _ \ _ __ ___ _ __ ___ _ __| |_ | | | | |_) | \| | |_) | | '__/ _ \ '_ \ / _ \| '__| __|| |_| | __/| |\ | __/ | | | __/ |_) | (_) | | | |_ \___/|_| |_| \_|_| |_| \___| .__/ \___/|_| \__|原创 2020-07-15 22:56:42 · 21395 阅读 · 4 评论 -
面向对象的C语言编程-DynamicLinkageGenericFunctions--C语言中的偷梁换柱
文章目录`DynamicLinkageGenericFunctions`Constructors and Destructors方法、信息、类和对象`new``delete``clone``differ``sizeOf``main`总结`TIPS`DynamicLinkageGenericFunctions代码仓库[代码仓库]:https://github.com/zzu-andrew/linux-sys/blob/6c19498a436902120eec7e08c18e4a74d04dafa2 b+原创 2020-06-12 00:00:28 · 330 阅读 · 1 评论 -
面向对象的C语言编程--如何取结构体指针中的指针
* (const struct Class **) p = class;#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <stdarg.h>void test(void);struct String { const void * class; /* must be first */ char * text;原创 2020-05-31 23:03:55 · 1636 阅读 · 1 评论 -
面向对象C语言编程--抽象数据类型-AbstractDataTypes
AbstractDataTypesC语言的灵活C语言很灵活,不但有基础数据类型,char、int、double等,还允许程序员自定义类型,如:定义一个链表使用的数据类型,其中有Node节点和自己需要使用的其他数据信息。typedef struct node { struct node * next; ... information ...} node;一个小例子-setset会有这些操作:#ifndef SET_H#define SET_Hextern const v原创 2020-05-30 12:54:29 · 1075 阅读 · 0 评论 -
通过清华镜像网站下载eclipse
使用官网下载eclipse的速度实在让人受不了,可以使用清华镜像网站下载eclipse镜像网站原创 2020-05-17 17:15:23 · 14412 阅读 · 4 评论 -
GNU-as汇编
GNU as汇编在编译C语言程序时,GNU gcc编译器会首先输出一个作为中间结果的as汇编语言文件,然后gcc回调用as汇编器把这个临时汇编语言程序编译成目标文件。即实际上as汇编器最初是用于专门汇编gcc产生的中间汇编语言程序的,而非作为一个独立的汇编器使用(这也就是为什么你只调用gcc就能将你的c语言代码编译成可执行文件,因为在需要的时候gcc会调用汇编器的)。编译as汇编语言程序使用as汇编器编译一个as汇编语言程序的基本命令行格式如下:as [option] [-o objfile] [s原创 2020-05-17 16:54:10 · 1146 阅读 · 0 评论 -
小s结尾与大S结尾的汇编语言差异
汇编器预处理as汇编器会对汇编语言进行简单的预处理,该预处理功能会调整并删除多余的 空格字符和制表符;删除所有注释语句并且使用单个空格或者一些换行符替换它们;把字符常数转换为对应的数值。但是该预处理功能不会对宏定义进行处理,也没有处理包含文件的功能。如果需要这方面的功能,那么就可以让汇编语言程序使用大写的后缀.S让as使用gcc的CPP预处理功能。...原创 2020-05-10 18:54:08 · 432 阅读 · 0 评论 -
学习网站大全
算法可视化算法网站中文可视化算法中文网址可视化算法英文网址原创 2020-04-18 12:35:00 · 1528 阅读 · 0 评论 -
C语言库自带的二分查找函数bsearch函数的使用示例
bsearch使用二分查找,查找一个被排序过的数组依赖头文件#include <stdlib.h> void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, ...原创 2020-04-13 22:53:55 · 2540 阅读 · 0 评论 -
linux中以A开头的函数使用方式历程及详解
A开头的Linux C函数abort异常终止程序abort函数在调用的时候,会触发SIGABRT信号#include <stdlib.h>#include <signal.h>#include <stdio.h>#include <unistd.h>static void signalHandler(int sig);// 信号...原创 2020-04-12 16:54:36 · 583 阅读 · 0 评论 -
一招让你彻底掌握C语言中运用宏以及#与##的妙用
学习C语言,特别是阅读linux源码的时候,大家经常遇到很多的宏定义,有简单的,当然也有很复杂的。有事一个宏定义甚至有几十行之多,遇到这种宏定义的大家基本上是一脸懵逼,不知所措,其实想复杂的宏定义没有去深究的价值,简短的才有深究的价值。但是你不理解这些长的宏定义就无法接着理解接下来的代码,今天这里就叫大家一个我经常使用的方法,来理解些宏定义,将你需要理解的宏定义,新建一个.c文件,比如test...原创 2020-04-07 00:01:31 · 333 阅读 · 0 评论 -
C语言高级技巧-在Makefile中引用你的头文件
在Makefile中添加头文代码仓库:Makefile中添加头文件引用我们常这样写C程序:#inlcude <stdio.h>int main(int argc, char *argv[]){ printf("Hello WOrld\n"); return 0;}如果你的程序是工程性质的,或者所有的程序都使用同一个头文件,那你没有使用在Make...原创 2020-04-06 23:22:43 · 3783 阅读 · 2 评论 -
VS-code中的Postman替代品
REST Client第一次看到 REST Client 并尝试它时,与现有的软件(如Postman)相比,它似乎不是一个非常有用的工具。但是,对 REST Client 扩展的用法了解越多,就会意识到它对开发工具的影响有多大,尤其是在测试API 时。只需要创建一个新文件写入下面这一行:https://google.com然后转到命令面板(CTRL + SHIFT + P),单击Res...原创 2020-02-01 12:03:41 · 1946 阅读 · 0 评论 -
二进制转换为八进制-栈方式实现
文章目录二进制转换为八进制二进制转换为八进制 二进制转换为八进制,需要使用两个栈,一个栈用于存储二进制数据,另一个栈用于存储八进制数据。 每三个二进制数据代表一个八进制数据。因此,需要弹出三个二进制数据并将其转换为对应的八进制,然后在将八进制数据压栈。/********************************************************** * @ 二进制...原创 2019-10-07 13:48:20 · 2424 阅读 · 4 评论 -
二进制转十进制-栈的方式实现
文章目录二进制转十进制实现二进制转十进制实现#include <stdio.h>#include <stdlib.h>#include <math.h>#define STACK_INIT_SIZE 20#define STACKINCREMENT 10typedef char ElemType;typedef struct{ ...原创 2019-10-07 13:16:12 · 625 阅读 · 0 评论 -
单向循环链表的实现
文章目录单向循环链表的实现单向循环链表的初始化向链表中插入一个数据删除链表中的一个数据查找链表中的指定的数据单向循环链表的实现单向循环链表的初始化//< 初始化单向循环链表void ds_init(node **pNode){ int item; node *temp; node *target; printf("初始化单向循环链表\n"); ...原创 2019-10-06 23:52:59 · 480 阅读 · 1 评论 -
有环链表监测方法
文章目录有环链表检测链表是否有环的两种方法有环链表检测链表是否有环的两种方法第一种快慢指针法 快慢指针法,每次走一步,另外一个指针每次走两步,或者更多,当两个指针能够指向同一个位置的时候,说明链表中存在环。// 利用快慢指针的方法int HasLoop2(LinkList L){ LinkList p = L; LinkList q = L; while ...原创 2019-10-06 22:30:18 · 234 阅读 · 0 评论 -
单向链表的实现
文章目录单向链表的实现单向链表的实现源代码地址定义链表节点LinkList L;typedef struct Node{ ElemType data; // 节点中的数据 struct Node *next; // 指向下一个节点的指针}Node;typedef struct Node *LinkList; /* 定义LinkList */初始化单项链表I...原创 2019-09-28 23:26:54 · 386 阅读 · 0 评论