
C++
文章平均质量分 89
Redamanc
眸子清亮,
脑子灵光。
展开
-
C++观察者模式(发布-订阅)的使用
观察者模式 - Observer Pattern模式简介介绍优点缺点代码实现场景说明实现代码关键解读运行结果参考资料模式简介观察者模式(Observer Pattern),也叫我们熟知的发布-订阅模式。它是一种行为型模式。介绍观察者模式主要关注的是对象的一对多的关系,也就是多个对象依赖于一个对象,当该对象的状态发生改变时,其他对象都能够收到相应的通知。意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变原创 2021-05-23 16:22:15 · 1824 阅读 · 7 评论 -
C++适配器模式的实现及应用
适配器 - Adapter Pattern模式简介介绍优点缺点代码实现情景模拟代码运行结果参考资料模式简介介绍适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式。意图:将一个类的接口转换成为客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要解决:主要解决在软件系统中,常常要将一些“现存的对象”放到新环境中,而新环境的接口是现有对象不能满足的。优点可以让任何两个没有关联的类一起工原创 2021-05-23 15:22:33 · 1033 阅读 · 3 评论 -
C++装饰器模式的实现
装饰器模式 - Decorator Pattern模式思想模式简介模式优点模式缺点代码实现情景模拟代码实现运行结果参考资料模式思想模式简介装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。何时使用:在不想增加很多子类的情况下扩展类。如何解决:将具体功能职责划分,同时继承装饰器模式。原创 2021-05-23 14:30:21 · 966 阅读 · 1 评论 -
C++代理模式的实现
代理模式 - Proxy Pattern模式思想简介组成优点代码实现情景代码解读结果参考资料模式思想简介代理模式:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。组成抽象角色:通过接口或抽象类声明真实角色实现的业务方法;真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用;代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己原创 2021-05-23 13:31:38 · 262 阅读 · 1 评论 -
C++工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式前言为什么要使用工厂模式优点缺点简单工厂(Simple Factory)代码应用工厂方法(Factory Method)代码应用抽象工厂(Abstract Factory)代码应用前言为什么要使用工厂模式主要是对对象的创建进行了一个封装;因此也属于创建型模式。意图:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。主要解决:主要解决接口选择的问题。优点一个调用者想创建一个对象,只要知道其名称就可以了;扩展性高,如果想增加一个产品,只要原创 2021-05-22 11:41:02 · 11072 阅读 · 3 评论 -
C++单例模式的实现(懒汉式、饿汉式)
单例模式-Singleton名词解释动机要点饿汉式实现方式运行结果懒汉式常规实现线程安全版实现精简实现参考资料名词解释数学与逻辑学中,singleton定义为:有且仅有一个元素的集合。单例模式最初的定义出现在《设计模式》(艾迪生维斯理,1994):"保证一个类仅有一个实例,并提供一个访问它的全局访问点。"动机对于系统中的某些类来说,只有一个实例很重要:例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号原创 2021-05-20 20:55:38 · 2647 阅读 · 8 评论 -
通过自定义vector和string来理解move和forward
move、forward前言自定义vector和string的结合测试代码问题剖析move(移动语义)简单总结forward(类型完美转发)前言在前面,我们分别实现了自定义的vector和string:传送仓:《C++实现自定义vector以及allocator》;《从自定义string类型理解右值引用》。那么今天,我们就将二者结合起来:用自定义的vector来存储自定义的string。看看又会有什么问题产生。自定义vector和string的结合我们将两个自定义的代码融合如下:cla原创 2021-05-20 16:11:18 · 454 阅读 · 0 评论 -
从自定义string类型理解右值引用
理解右值引用前言问题复现自定义string(CMyString)遇到问题图示理解右值引用什么是右值添加右值引用参数的成员方法结果对比前言在之前,我写过一篇:通过自定义string类型来理解运算符重载。在文章末尾,我提出了一个问题:那么如何能够实现不泄露内存,并且提高效率呢?那么,今天就来看看如何解决这个问题。问题复现自定义string(CMyString)首先是对string类型的一个简单实现,代码如下:class CMyString{public: CMyString(const原创 2021-05-20 14:26:10 · 1085 阅读 · 4 评论 -
C++实现自定义vector以及allocator
实现vector前言初步实现出现的问题解决问题Allocator(空间配置器)最终结果对比系统自带的前言不知道大家有没有这种感觉,学习了一段时间后,总想着自己能够实现一些标准库里已经提供的东西,比如说STL容器vector、比如数据类型string。一方面是对这个知识可以有进一步的一个认识和了解,另一方面也可以检验自己的掌握程度。基于此,我们今天实现自定义的vector。初步实现通过包含头文件#include <vector>转到文档,我们可以查看系统自带vector的实现:主要原创 2021-05-20 12:00:05 · 3562 阅读 · 10 评论 -
C++线程间的互斥和通信
互斥锁、条件变量、原子类型互斥锁(mutex)模拟车站卖票不加锁的结果加锁后的结果简单总结条件变量(conditon_variable)生产者消费者线程模型产生问题解决问题原子类型(atomic)简单使用改良车站卖票互斥锁(mutex)为了更好地理解,互斥锁,我们可以首先来看这么一个应用场景:模拟车站卖票。模拟车站卖票场景说明:Yang车站售卖从亚特兰蒂斯到古巴比伦的时光飞船票;因为机会难得,所以票数有限,一经发售,谢绝补票。飞船票总数:100张;售卖窗口:3个。对于珍贵的飞船票来说,这个资原创 2021-05-19 19:55:43 · 1542 阅读 · 14 评论 -
C++对象优化
C++对象的优化为什么需要(对象)优化对象使用过程中都调用了哪些方法示例代码:运行结果:结果解释:对象优化及规则优化后的结果具体优化过程对象优化的三条规则为什么需要(对象)优化我们都知道,C语言和C++在程序执行中,都是通过调用一系列的函数来实现的。并且,很多时候,编译器会帮助我们做一系列的事情,比如(在编译类的成员方法的时候,编译器默认添加 this 指针,以此来确定是哪一个对象调用了该成员方法)。得益于编译器或者说系统帮助我们做的一系列事情,我们可以更加方便地使用C++。但是凡事有利必有弊,因为原创 2021-05-18 19:57:13 · 455 阅读 · 9 评论 -
理解虚基类、多重继承的问题
虚基类和多重继承什么是多重继承多重继承的优点关于菱形继承的问题其他多重继承的情况如何解决多重继承的问题什么是虚基类虚基类如何解决问题查看虚基类的内存布局对比普通继承下的内存布局什么是多重继承多重继承,很好理解,一个派生类如果只继承一个基类,称作单继承;一个派生类如果继承了多个基类,称作多继承。如图所示:多重继承的优点这个很好理解:多重继承可以做更多的代码复用!派生类通过多重继承,可以得到多个基类的数据和方法,更大程度的实现了代码复用。关于菱形继承的问题凡事有利也有弊,对于多继承而言,也原创 2021-05-04 23:20:19 · 648 阅读 · 0 评论 -
理解虚析构函数
虚析构函数示例代码(普通析构)存在问题修改代码(虚析构)相关问题构造函数可以是虚函数吗?什么时候需要虚析构函数?示例代码(普通析构)老样子,我们先来看如下代码:class Base{public: Base(int data) :ma(data) { cout << "Base()" << endl; } // 虚析构函数 virtual ~Base() { cout << "~Base()" << endl; } virtual void原创 2021-05-03 10:24:33 · 187 阅读 · 1 评论 -
从编译器角度理解虚函数、静态绑定和动态绑定
虚函数、静态绑定、动态绑定示例代码示例结果对比代码对比结果虚函数静态绑定动态绑定查看虚函数示例代码我们首先来看这么一段代码,设计了两个类:Base、Derive;Base类包含一个保护的成员变量:ma;以及构造函数和两个show方法(一个不带参数,一个带有参数)。Derive类公有继承Base类:class Derive : public Base;包含一个私有的成员变量:mb;以及构造函数和一个show方法(不带有参数)。class Base{public: Base(int dat原创 2021-05-02 11:28:26 · 491 阅读 · 1 评论 -
通过自定义string类型来理解运算符重载
自定义string类型理解系统自带string类型示例代码功能展示自定义string类型比较运算符(>、<、==)重载输出运算符(<<)重载加法运算符(+)重载下标运算符([])重载完整代码功能对比存在问题理解系统自带string类型在C语言中我们一般使用字符数组来保存字符串。存在诸多不方便的地方:比如数组大小、数组长度、数组扩容等等。为了更好地使用字符串,C++提供了string类型。使用它需要引入头文件:#include <string>。示例代码我们可原创 2021-04-27 14:37:21 · 666 阅读 · 0 评论 -
从编译器角度理解C++代码的编译、链接
C++代码的编译链接示例代码编译过程预编译编译汇编链接过程相关面试题参考资料由于Windows操作系统下的IDE不好查看编译链接的详细过程,故本文使用Linux操作系统。具体版本:Linux version 4.15.0-30deepin-generic。示例代码示例代码有两个:main.cpp 和 sum.cpp:// main.cpp#include <iostream>using namespace std;extern int gdata;int sum(int,in原创 2021-04-26 22:50:56 · 1894 阅读 · 8 评论 -
从汇编指令角度理解函数调用过程
从指令角度理解函数调用过程示例代码生成指令具体过程参考资料示例代码我们首先来看如下代码:int sum(int a, int b){ int temp = 0; temp = a + b; return temp;}int main(){ int a = 10; int b = 20; int ret = sum(a, b); return 0;}生成指令int sum(int a, int b)// push ebp// mov ebp,esp// sub原创 2021-04-18 15:55:35 · 453 阅读 · 0 评论 -
进程虚拟地址空间区域划分
进程虚拟地址空间区域划分代码入手简单图示具体解释何为虚拟?为何是4G?user spacekernal space参考资料代码入手首先我们来看一段简单的代码:#include <iostream>using namespace std;int gdata1 = 10;int gdata2 = 0;int gdata3;static int gdata4 = 11;static int gdata5 = 0;static int gdata6;int main(){原创 2021-04-18 11:12:18 · 409 阅读 · 0 评论 -
C++实现MySQL数据库连接池
ConnectionPool-MySQL项目背景功能点介绍关键技术点MySQL数据库编程压力测试参考资料项目背景常见的MySQL、Oracle、SQLServer等数据库都是基于C/S架构设计的,即(客户端/服务器)架构,也就是说我们对数据库的操作相当于一个客户端,这个客户端使用既定的API把SQL语句通过网络发送给服务器端,MySQL Server执行完SQL语句后将结果通过网络返回客户端。通过网络通信的话就要涉及到TCP/IP协议里的“三次握手”、“四次挥手”等,大量访问时,每一个用户的请求都会对应原创 2021-04-04 19:47:45 · 1088 阅读 · 1 评论 -
C++初探智能指针
智能指针什么是智能指针为啥需要智能指针智能指针的原理智能指针的类别简单案例运行结果参考资料什么是智能指针学过C语言的人肯定对“指针”这个概念不陌生,简单来说,指针就是“地址”。那么智能指针是什么呢?“智能地址”吗?准确地来说,智能指针并不能算作是指针。在《C++ Primer Plus》一书中,就这样定义到:智能指针是行为类似于指针的类对象,但这种对象还有其他功能可以看到,智能指针其实是一个类对象。为啥需要智能指针智能指针的原理智能指针的类别简单案例运行结果参考资料...原创 2021-03-11 21:28:57 · 169 阅读 · 0 评论 -
C++虚函数的简单理解
虚函数为何要用工作原理内存布局1.只有数据成员的对象2.仅拥有一个虚函数的类对象3.拥有多个虚函数的类对象简单总结参考资料为何要用在了解虚函数的原理、实现之前,我们肯定心里会有所疑惑,为什么需要用到虚函数呢?普通函数存在什么弊病吗?带着这个疑惑,我们可以来看看官方给出的解释:虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。很迷惑对吧?我们再来看看别的博主给出的解释:原创 2021-03-08 22:52:14 · 308 阅读 · 0 评论 -
C++标准模板库STL模板类vector浅析
容器vector什么是vector可执行的操作测试代码运行结果参考资料什么是vector解释一:在计算中,矢量(vector) 对应数组,而不是数学矢量。在数学中,可以使用N个分量来表示N维数学矢量,因此从这方面讲,数学矢量类似一个N维数组。然而,数学矢量还有一些计算机矢量不具备的其他特征,如内乘积和外乘积。计算机矢量存储了一组可随机访问的值,即可以使用索引来直接访问矢量的第10个元素,而不必首先访问前面9个元素。解释二:vector 容器是 STL 中最常用的容器之一,它和 array原创 2021-03-07 15:41:15 · 701 阅读 · 0 评论 -
C++简单实现C4.5算法生成决策树
C4.5算法实现C4.5算法简介算法解析示例数据数据处理计算类别信息熵计算各属性信息熵计算信息增益计算属性分裂信息度量计算信息增益率代码实现文件调用关系关键代码运行结果编译器结果理解结果参考资料C4.5算法简介C4.5算法是由Ross Quinlan开发的用于产生决策树的算法。该算法是对Ross Quinlan之前开发的ID3算法的一个扩展。C4.5算法产生的决策树可以被用作分类目的,因此该算法也可以用于统计分类。C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习:给定一个数原创 2021-02-25 17:22:00 · 2568 阅读 · 2 评论 -
C++_const_浅析
const简单理解constconst的作用const的不同修饰变量修饰指针函数使用类中使用记忆小技巧参考资料简单理解const我们经常使用到const,简单来说,const就是不允许改变的意思。C语言中的const:它限定一个变量不允许被改变,产生静态作用。C++中的const:const 限定符,它把一个对象转换成一个常量。const的作用1)欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;2)对指针而言,可以指定指针本身为co原创 2021-02-12 19:17:42 · 264 阅读 · 0 评论 -
如何在main函数之前和之后执行别的函数?
如何在main函数之前和之后执行别的函数?问题引入C++解决方案C语言解决方案Windows(VC、VS):Linux(gcc):参考资料问题引入我们通常会认为,程序的执行总是从main函数开始,到main函数结束。其实,这个说法并不准确。具体细节,我们先不深究,我们就来说说,既然程序并不总是从main函数开始,到main函数结束。那我们可不可以在main函数之前和之后执行其他的函数呢?C++解决方案C++的解决方案很好理解:基于全局变量在主函数运行之前的特性,定义一个全局的对象,在构造函数和原创 2021-02-12 14:16:08 · 1727 阅读 · 0 评论 -
C++_this指针_初理解
this指针问题切入什么是this指针?this指针怎么用?this指针的注意点参考资料问题切入我们在学习C++的时候,会了解到面向对象的思想以及类与对象。简单的来说,类是一个设计图纸:我们现实客观世界的实体经过分析和抽象之后得到我们主观世界里的抽象类别,也就是你脑子里的各种idea,当你把脑子里的这种抽象类别设计出来之后,就得到了类(class),最后对class进行实例化得到我们的对象(object)。整个过程可以用如下的图来理解:关于对象的模型,可以存在如下两种方案:毫无疑问,为了节原创 2021-02-11 18:13:12 · 293 阅读 · 0 评论 -
C++_new_浅析
浅析newnew表达式内存泄露比较 malloc && freenew的三种调用参考资料new表达式创建并初始化拥有动态存储期的对象,这些对象的生存期不受它们创建时所在的作用域限制。解释:new 表达式尝试申请存储空间,并在已申请的存储空间上,尝试构造并初始化为一个无名对象,或无名对象的数组。new表达式返回一个指向所构造的对象或者对象数组的纯右值指针。注: 纯右值:满足下列条件之一:1)本身就是赤裸裸的、纯粹的字面值,如3、false;2)求值结果相当于字面值或是一个不具名原创 2021-02-09 10:21:54 · 240 阅读 · 0 评论 -
C++_inline函数(内联函数)浅析
inline函数浅析内联函数处理方式内联函数与普通函数的区别内联函数与static修饰的函数的区别内联函数与宏的区别使用场景汇编层次内联的处理参考资料内联函数在C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别地引入了inline修饰符,表示为内联函数。如下简单示例:inline int Max(int a, int b){ return a + b;}处理方式内联函数的处理方式是在函数的调用点直接代码展开。在计算机系统下,如果频繁的调用会造成较大的时间开销。内联原创 2021-02-08 09:15:22 · 200 阅读 · 0 评论 -
C++ - 了解Name Mangling
C++ - 了解Name Mangling函数重载什么是 Name Mangling?Name Mangling 如何实现的?如何禁用呢?参考资料名字粉碎?命名粉碎?名称改编?or 命名倾轧(实属拗口)?函数重载函数重载:为方便使用,C++允许在同一范围内声明几个功能类似的同名函数,但是这些同名函数的形式参数(个数、类型、顺序)必须不同,也就是说用同一个函数完成不同的功能。注:在C语言中,不支持函数的重载,即C语言中一个函数不能与另一个函数重名。重载原则:①函数名相同,函数的参数列原创 2020-12-07 17:01:21 · 415 阅读 · 0 评论 -
C++ - 常见访问限定符的说明
上一节在类的创建中,提到了访问限定符,但没怎么细说,我们就来研究一下:访问限定符定义(百度百科):访问限定符是用于指定成员或者类型的可访问性的关键字。public:修饰的成员在类外可以被直接访问;private:修饰的成员在类外不能被直接访问;protected:修饰的成员在类外不能被直接访问;(此处的 private 和 protected 是类似的)说明:访问权限的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止;class 的默认访原创 2020-12-07 14:21:59 · 889 阅读 · 2 评论 -
C++ - 类和对象的创建
类(class)在 C++ 中,类是一种 数据类型 。描述:客观事物是复杂的,要描述它必须从多方面来进行。也就是用不同的数据类型来描述不同的方面。举例:商场中的商品商品名称:用字符串描述;商品数量:用整型数据描述;商品单价:用浮点数描述;商品总价:用浮点数描述;示例代码:class CGoods{public: char Name[21];//注释1 int Amount; float Price; float Total_value;public: voi原创 2020-12-07 13:18:57 · 346 阅读 · 0 评论