
C/C++
四九城小白~阿勋
这个作者很懒,什么都没留下…
展开
-
C++自带sort函数对vector容器元素进行排序
#include<iostream>#include<algorithm>#include<vector>#include <string>using namespace std;//自定义排序函数 bool sortFun(const string p1, const string p2){ string ss1 = p1.substr(6, 7); //获取子字符串。 int val1 = std::stoi(ss1...原创 2021-06-12 00:08:17 · 1616 阅读 · 0 评论 -
虚函数表详解
虚函数表详解概述类的虚表虚表指针动态绑定总结参考资料示例代码关键词:虚函数,虚表,虚表指针,动态绑定,多态概述 为了实现 C++ 的多态,C++ 使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。类的虚表虚表是一个指针数组,其元素是虚函数的指针,每个元素对应一个虚函数的函数指针。需要指出的是,普通的函数即非虚函数,其调用并不需要经过虚表,所以虚表的元素并不包括普通函数的函数指针。虚表内的条目,即虚函数指针的赋值发生在编译器的编译阶段,也就转载 2020-08-02 01:41:40 · 428 阅读 · 0 评论 -
类的设计模式(1)--单例模式
单例模式描述UML图:单例代码分析测试代码总结描述单例的一般实现比较简单,下面是代码和UML图。由于构造函数是私有的,因此无法通过构造函数实例化,唯一的方法就是通过调用静态函数GetInstance。UML图:单例代码//Singleton.h class Singleton { public: static Singleton* GetInstance()...原创 2019-12-30 15:16:12 · 276 阅读 · 0 评论 -
关于结构体数组的使用
关于结构体数组的使用类型定义结构体定义map定义构建结构体数组结构体数组添加到map容器中查询类型定义结构体定义typedef struct DevStatueInfo{ CString sStatueId; CString sDescribe;};map定义map<CString, CString> m_devInfoMap;构建结构体数组static De...原创 2019-11-21 22:10:26 · 382 阅读 · 0 评论 -
C++ 类内函数指针的使用的使用
引言 在C++实际应用中,经常遇到需要处理n多命令的场景。比如输入是xml的字符串,需要根据里面的定义实现不同的处理功能。在这种场景下,我们通常是接收xml作为一个接口,在里面分析出来命令类型,然后使用一堆的if else语句来进行处理。但是在这种极其具有统一性的场景中,还可以使用函数处理指针,来进行处理。代码示例#include <string>#i...原创 2019-10-28 11:08:56 · 259 阅读 · 0 评论 -
指针面试总结
指针面试总结一、指针考察总结:二、指针和引用三、函数指针一、指针考察请看下面三种定义:const char *p;char const *p;char * const p;请问三者有什么区别?先看第一种,先看p,根据优先级它和*结合,是指针,指向char类型,但是char前面有一个const修饰,所以p所指向的内容为const类型不可修改。第二种:由于没有const *的运...原创 2019-09-27 11:17:32 · 275 阅读 · 0 评论 -
C++细节 深拷贝和浅拷贝(位拷贝)
前提在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。总结浅拷贝:位拷贝,拷贝构造函数,赋值重载多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏。深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符。先看一个例子,有一个学...原创 2019-09-26 17:53:29 · 239 阅读 · 0 评论 -
c语言编译过程详解,预处理,编译,汇编,链接
前言我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。文件编译过程总结预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)编译, 检查语法,生成汇编 ...原创 2019-09-26 11:21:12 · 262 阅读 · 0 评论 -
C/C++结构体字节对齐详解
前提:为了访问速度和效率,需要各种类型数据按照一定的规则在空间上排列;不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。为了访问未对齐的内存,处理器需要作两次内存访问;⽽对齐的内存访问仅需要⼀次访问。于是有了字节对齐,4个字节是一个自然对齐为什么是4个字节?32位机,即计算机数据总线宽度为32个,一次可以处...原创 2019-09-25 23:25:03 · 392 阅读 · 0 评论 -
C++中传值、传址与传引用的总结
C++中传值、传址与传引用的总结引言一、引用的特性:二、引用和指针的区别与联系:1.相同点:2.不同点:三、传值、传地址、传引用的区别1.传值2.传地址3.传引用四.哪种更高效?引言指针:指针是一个变量,只不过这个变量中存储的是一个地址,指向内存中的一个单元。引用:引用和原变量是同一个东西,只不过是原变量的一个别名。int a = 10; 定义一个整型变量aint *p = &am...原创 2019-09-27 11:29:44 · 455 阅读 · 0 评论 -
C++ regex库的三种正则表达式操作
C++ regex库的三种正则表达式操作关于正则表达式的语法和字符含义如何使用C++的regex库完成正则匹配,正则查找,正则替换三种操作首先是头文件正则表达式声明匹配结果存放变量声明数据准备正则操作关于正则表达式的语法和字符含义读懂正则表达式就这么简单 - Zery - 博客正则表达式 – 语法 | 菜鸟教程如何使用C++的regex库完成正则匹配,正则查找,正则替换三种操作首先是头文...原创 2019-10-04 23:01:15 · 510 阅读 · 0 评论 -
C/C++内存管理详解
C/C++内存管理详解简介明确区分堆与栈堆和栈究竟有什么区别控制C++的内存分配重载全局的new和delete操作符为单个的类重载new[]和delete[]常见的内存错误及其对策针与数组的对比修改内容内容复制与比较计算内存容量指针参数是如何传递内存的内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码...原创 2019-10-06 00:25:57 · 331 阅读 · 0 评论 -
内存池的设计思想
@内存池的设计思想内存池是什么?内存池是一组资源的集合。程序在申请堆上的内存时,我们可以给它一大块内存(远超出程序要申请的大小,即内存池),并且自己管理,而不是它要多少就从切换到内核态,给它多少。为什么要设计内存池?两个原因:1.因为频繁的new/delete 用户态转内核态,效率低:因为物理内存是一个物理硬件,程序要从物理硬件上申请资源,要调用系统调用,要切换到内核态,还调用驱动···...原创 2019-10-06 16:10:10 · 304 阅读 · 0 评论 -
C++多态之带有虚函数的菱形继承与菱形虚拟继承
继承是C++三大特性之一,而继承又分为单继承和多继承,将单继承和多继承组合起来就成了复杂的菱形继承,本文重点讲菱形继承带来的问题和如何解决该问题。●回顾知识:单继承:一个子类只有一个直接父类时称这个继承关系为单继承。多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。●菱形继承一、什么是菱形继承?菱形继承是多继承的一种特殊情况,由单继承和多继承构成,继承关系看起...原创 2019-10-06 23:46:09 · 564 阅读 · 0 评论 -
线程池原理
线程池原理前言线程池的优点:结构讲解:线程池总体结构二、线程数组三、任务队列四、管理者线程五、释放前言源码 密码:pp42线程池大家都听说过或者使用过,线程池的工作原理:线程池在创建之后,线程池内没有一个线程,在添加任务之后;只有在运行的线程数小于核心线程数时,创建核心线程,执行任务;当达到最大核心线程数,但是队列未满的情况,则往队列中添加,等待有空闲的核心线程之后,从队列中取出任...原创 2019-10-08 21:47:20 · 486 阅读 · 0 评论 -
MFC子父窗口发送消息
1. 插入新对话框,并建立新类,注意Base Class要选CDialog;2. 在新生成类的.cpp文件中,include主对话框的头文件:#include "PCRProjectDlg.h" // 主窗口类的头文件3. 在父窗口的.h文件中,3.1 include子窗口的头文件:#include "ParsaveDlg.h" // 新添加窗...原创 2019-09-21 00:25:03 · 344 阅读 · 0 评论 -
c++ 序列化和反序列化
c++ 序列化和反序列化什么是序列化?为什么要序列化?优点在哪里?C++对象序列化的四种方法Google Protocol Buffers(protobuf)Boost.SerializationMFC SerializationNet Framework简单总结举例说明什么是序列化?序列化指的是将一个内存对象转化成一串字节数据(存储在一个字节数组中),可用于保存到本地文件或网络传输。反序列...原创 2019-09-19 15:53:41 · 7163 阅读 · 0 评论 -
map的使用
map定义:typedef map<string, string> Prop;typedef Prop::iterator PropIter;typedef map<string, Prop> PropSet;typedef PropSet::iterator PropSetIter;嵌套map的添加元素;(1)方式一:auto temp1 = ...原创 2018-10-30 19:02:42 · 171 阅读 · 0 评论 -
MFC之Tree Control控件
Tree Control顾名思义,样子自然是长的像树了,非常适合用来显示有树形结构的信息.创建Tree Control静态创建大部分时候我们都是用静态方式创建控件,因为这最简单.直接从Toolbox中拖一个控件放到Dialog中就行了.然后要以在Properties页面设置一些属性.如果要在代码中对控件进行操作,可以这样得到控件指针,GetDlgItem(Ctrl_ID)...原创 2018-07-26 21:43:07 · 2166 阅读 · 0 评论 -
MFC的坐标转换GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient
注意:windows的屏幕左上点为基点,也即原点,向右x轴正向,向下y轴正向注意:区分两个概念 (假设显示器1024*768)屏幕-左上点:1024*768的屏幕(显示器),屏幕(显示器)的左上点 就是 (0,0)窗口-左上点:指我们所打开程序窗口的客户区左上点,窗口可能居中展示,此时窗口左上点和屏幕左上点是不一致的。例如:我们双击了notepad图...转载 2018-11-03 15:32:28 · 739 阅读 · 0 评论 -
创建带数字标识的名称,删除后进行添加,从当前数字标识进行累加
创建带数字标识的名称,删除后进行添加,会从当前数字标识累计来增加数字标识名称。举例:依次点击按钮创建名称后VP0,VP1,VP2,VP3,VP4。删除VP4后,显示节点名称为:VP0,VP1,VP2,VP3下次点击创建节点时,生成名称为VP4。节点仍为VP0,VP1,VP2,VP3,VP4void GetViewPointDefaultName(string& nam...原创 2019-04-25 15:38:54 · 179 阅读 · 0 评论 -
智能指针的原理示例
1 传统指针存在的问题刚学C++的朋友,要数最令人头疼的问题莫过于指针了。当你在堆上创建了一个对象时,系统就把这个对象的生命期完全交给了你,当用完之后,系统并不会回收资源,而是需要你来释放它。那么,既然要负责对象的释放问题,就要知道什么时候释放和在哪里释放。如果你没有处理好这两个问题,就会造成内存泄漏或程序崩溃的问题。//1 内存泄漏 str1所指的资源没有被释放{ s...原创 2019-05-05 22:36:52 · 449 阅读 · 0 评论 -
Qt中关于qDebug的使用
在项目的开发中,当我们调试程序时,最常用的就是打印信息了,Qt为我们提供了非常方便的打印信息类QDebug。大家应该已经很熟练的使用QDebug了,但也许有些地方并没有注意到,下面小豆君就介绍一下QDebug的一些常用特性。1 qDebug()的最常用法我们可以使用qDebug像使用std::cout一样,直接在重定向操作符(<<)后面加上我们的字符串即可。如:q...原创 2019-05-05 22:49:47 · 28773 阅读 · 0 评论 -
C++的OOP特性
内存模型和名称空间 存储持续性,作用域和链接性 C++有三种方案来存储数据 自动存储持续性:在函数定义中声明的变量,包括函数参数。在函数或代码块开始执行时创建。执行完函数或者代码块,内存自动释放。 静态存储持续性:函数定义外定义的变量和使用关键字static定义的变量。他们在程序的整个运行过程中都存在。 动态存储持续性:用new分配的内存,要显式使用del...原创 2019-05-15 15:19:15 · 218 阅读 · 0 评论 -
C++ OOP面向对象
c++ OOP的一些总结1 面向对象特点:封装,继承,多态2 抽象类抽象类是特殊的类,只是不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性;抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。虽然不能定义抽象类的实例,但是可以定义它的指针,这正...原创 2019-05-15 15:21:15 · 259 阅读 · 0 评论 -
关于map查找的问题,自定义结构体作为key
map查找的问题,自定义结构体作为key,为什么只重载“<”就可以了重载了“<”就知道如何比较两个结构就能排列啦只用<号也能判断相等啊:if( (!(a<b) && !(b<a) ) //ok,a==belse //a!=b 条款19:了解相等和等价的区别STL充满了比较对象是否有同样的值。比如,当你用find来定位...原创 2019-06-12 16:35:45 · 3810 阅读 · 2 评论 -
MFC-ListControl常用操作汇总
本文根据本人在项目中的应用,来谈谈CListCtrl的部分用法及技巧。当初学习时,查了很多资料,零零碎碎的作了些记录,现在主要是来做个总结,方便以后查阅。主要包括以下十三点内容:基本操作、获取选中行的行号、复选框操作、动态设置选中行的字体颜色、设置选中行的背景颜色、禁止拖动表头、让第一列居中显示、设置行高与字体、虚拟列表技术、点击表头时进行归类、向上与向下移动、动态调整大小问题、避免闪烁问题。...原创 2019-08-15 17:28:28 · 1032 阅读 · 0 评论 -
UML之类图设计
类图设计<<abstract>>:表示SingleCore、MultiCore和CoreFactory类均定义为抽象类。(纯虚函数的类被称为抽象类(abstractclass),而只含有虚函数的类(class)不能被称为抽象类(abstractclass)。)。指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的...原创 2019-09-09 22:55:56 · 1688 阅读 · 0 评论 -
使用VC2008开发OCX
1、新建OCX工程1.1新建MFC ActiveX Control工程,工程名称MyOcx,如下图:1.2、工程建好后,在MyOcx.idl文件中,找到下图部分,uuid则为该新建ocx的id号。1.3、在MyOcxCtrl.cpp文件中的OnDraw函数描绘了该ocx的样式,如下图(绘制了一个矩形和一个椭圆),如要在ocx中嵌入对话框,也在该函数内部修改。1.4、如需...原创 2019-09-16 11:10:30 · 361 阅读 · 0 评论 -
C++线程安全的单例模式
什么是线程安全?在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。如何保证线程安全?给共享的资源加把锁,保证每个资源变量每时每刻至多被一个线程占用。 让线程也拥有资源,不用去共享进程中的资源。如: 使用threadlocal可以为每个线程的维护一个私有的本地变量。什么是单例模式?单例模式指在整个...原创 2019-09-16 15:20:07 · 305 阅读 · 0 评论 -
[c++11]多线程编程(一)
什么是并发并发在生活中随处可见,边走路边说话,边听歌边写代码。计算机术语中的"并发",指的是在单个系统里同时执行多个独立的活动,而不是顺序的一个接一个的执行。对于单核CPU来说,在某个时刻只可能处理一个任务,但它却不是完全执行完一个任务再执行一个下一任务,而是一直在任务间切换,每个任务完成一点就去执行下一个任务,看起来就像任务在并行发生,虽然不是严格的同时执行多个任务,但是我们仍然称之为并发(...原创 2019-09-19 00:06:04 · 138 阅读 · 0 评论 -
C++11中智能指针的原理、使用、实现
1.智能指针的作用C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。理解智能指针需要从下面三个层次:...原创 2019-04-21 22:06:42 · 110 阅读 · 0 评论