自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 设计模式——观察者模式

一,观察者模式要解决的问题:当事件到来的时候,通知对于该事件感兴趣的监听者处理事件。观察者模式定义了对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有与该对象又依赖关系的对象也会随之更新。二,观察者模式中的两个主体:1,观察者:负责注册事件;负责通知监听者有事件来临;2,监听者:负责处理监听到的事件;三,观察者模式的一个应用:MVC架构;四,观察者模式结构图(图来自《...

2019-09-03 22:27:38 171

原创 设计模式————单例模式(慢加载模式和快加载模式)

一,单例模式要解决的问题:为了节省资源,使得一个类只能实例化唯一的一个对象;二,单例模式的实现方式:将生成对象的接口(构造函数和拷贝构造函数)屏蔽起来,然后在给出一个唯一的静态接口在类外进行实例化。三,单例模式的分类:1,懒汉(慢加载模式):在第一次用到类实例的时候才会去实例化。与之对应的是饿汉式单例。(懒汉本身是线程不安全的)懒汉模式代码如下:#include&lt...

2019-08-30 16:22:35 361

原创 设计模式———工厂模式与抽象工厂模式

一,工厂模式要解决的问题:1,当使用继承和多态实现代码和接口的复用时,程序员很难记住需要新实例化的子类的名字XXX,因为在比较复杂的系统中,为了避免命名冲突,取得名字可能都不是很好记忆;2,程序的扩展和维护变得不好实现;3,有时程序员不清楚在父类中要实例化哪一个子类,只有在具体的子类中用到的时候才可以知道;二,对应以上问题工厂模式提供的功能:1,定义创建对象的接口,将对象 的创...

2019-08-30 11:58:33 193

原创 Linux基础(目录结构,文件描述符以及权限)

一,Linux的目录结构:/boot :存放内核文件以及开机所需配置文件 /bin :存放各种命令 /lib :存放各种库文件 /home : 普通用户的家目录(主文件夹) /dev : 设备与接口设备 /proc:虚拟文件系统 /usr :存放可分享的与不可变动的数据 /var:系统运行后才会渐渐占用硬盘容量的目录 /mnt :临时挂载点 /etc:存放...

2019-03-27 00:15:44 300

原创 线程相关的面试题

一,请描述线程和进程的差别进程是程序的一次执行,线程可以理解为进程中执行的一段程序片段。在一个多任务环境下以下概念可以帮助我们理解线程和进程之间的差别。进程是独立的,这表现在空间内存,上下文环境上;线程运行在进程空间内,一般来讲(不使用特殊技术),进程是无法突破进程边界存取其他进程内的存储空间;而线程由于处于进程空间内,所以同一进程所产生的线程共享同一内存空间。同一进程中的两段代码不能...

2019-03-26 16:52:27 283

原创 多继承,虚继承,虚函数下的内存布局

多继承是指一个派生类继承多个基类;多继承想要节省空间就需要用到虚继承,因此多继承或者说虚继承的一个弊端也显而易见,在菱形继承之下,B 继承A,C 继承A,D多继承B 和C,这样需要声明D 虚继承B和C ,还要在D的构造中指明A的构造方式。这样一来,D在看不到A的情况下,仍然需要指明A的继承方式。虚继承是指为了节省空间而将相同的数据区域使用虚基类指针而代替的一种继承方式(在C++中而言),虚基类...

2019-03-25 21:22:03 432

原创 剑指offer之赋值运算符函数和单例模式

一,题目:如下为类型为CMyString的声明,请为该类型添加赋值运算符函数class CMyString{public: CMyString(char* pData = NULL); CMyString(const CmyString& str); ~CMyString(void);private: char * m_pData;} ...

2019-03-22 23:57:50 177

原创 进程相关的面试题

一,试解释操作系统中的作业,进程,线程,管程的定义作业:用户在一次解题或者一个事务处理过程中要求操作系统所做的工作的集合。它包括用户程序,所需要数据及控制指令等。作业是由一系列有序的步骤组成的。 进程:一个程序在一个数据集合上的一次运行过程。所以一个程序在不同的数据集合上运行,或者一个程序在同一个数据集合上运行多次,都不是同一个进程。 线程:线程是进程的一个实体,是被系统独立调度和执行的基...

2019-03-22 20:15:14 1676

原创 关于虚函数和虚继承

基类中无虚函数,派生类中有虚函数,基类的指针指向派生类对象(指向的是派生类中基类的起始部分),delete 时只析构基类的对象而不析构派生类的对象。基类指针指向派生类的的情况下,基类的虚构要设为虚析构。虚表合并时向内层合并,虚表合并时会先拷贝一份副本,然后合并的时候使用副本合并。虚函数表的生成在编译器间,对象的生成在运行期间。对象的虚函数指针在构造之前就指向虚表了。即虚表的写入时机是...

2019-03-22 00:31:17 272

原创 堆和栈的区别

栈区,由编译器自动申请空间和释放空间,存放函数的参数,局部变量等。其操作方式类似于数据结构中的栈。 堆区,一般手动开辟空间和释放空间,若不手动释放,程序结束时可能由操作系统回收,与数据结构中的堆是两回事,分配方式类似于链表 全局区(静态区):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域,程序结束后由系统释放...

2019-03-20 20:48:11 408

原创 部分正则表达式含义

正则表达式的匹配分为两种,一种是匹配字符,一种是匹配位置\ 转义字符^ 匹配输入字符串的开始位置$ 匹配输入字符串的结束位置* 匹配前面的子表达式任意次+ 匹配前面的子表达式一次或多次? 匹配前面的子表达式一次或零次{n} n是一个非负整数,匹配确定的n次{n,} n是一个非负整数,至少匹配n次{n,m} n和m都是非负整数,并且n<m,最少...

2019-03-20 19:05:52 220

原创 C++中的虚函数

类和类的关系有以下三种:1组合关系 has_a a part of(需要注意的是私有继承属于组合关系) 2继承关系is_a a kind of 3代理关系(多用于容器适配器)同名函数之间有如下关系:函数重载:同名同作用域不同参 隐藏:派生类隐藏了基类中的所有同名函数(存在,看不见) 覆盖:派生类中同名同参的虚函数会覆盖基类中同名同参的虚函数(发生在虚表的合并阶段)...

2019-03-20 00:01:43 129

原创 MySQL的存取引擎

下面是MySQL服务器端的框架:不同搜索引擎的区别主要在于三个方面,分别是存储,读取和锁。事务是一组特定SQL语句的集合,事务的特性有ACID,即原子性,一致性,隔离性和持久性。存储引擎的类型:1,MyISAM:主要用于在线分析处理,即查询较多。不支持外键,支持表锁,支持全文索引,B+树索引(数据和索引分离也就是非聚簇索引)是通过指针查找文件,不支持事务。常用的几个文件扩展名...

2019-03-19 00:07:15 149

原创 继承的特性

C++中的三个特性是继承封装和多态。其中继承的主要用途在于代码的复用。首先如何继承一个类呢?我们只需要在我们实现的类后面加上继承方法再加上要继承的类名就可以了,此时被继承的类我们叫它基类或者父类,继承的类叫做派生类或者子类。继承分为单继承和多继承,单继承的话表明只继承一个类作为父类,也可以继承多个类,父类之间以“,”隔开就可以了。那么派生类继承了基类的什么呢?答案是派生类继承了除基类的构造...

2019-03-18 00:02:58 1320

原创 传输协议层协议之TCP

TCP协议的特点:面向连接,字节流,可靠传输。使用TCP协议的双方必须先建立连接,然后才能开始数据的读写。TCP的链接是全双工的,即双方可以通过同意连接进行读写。完成数据交换以后,双方必须断开以释放系统资源。TCP的链接是一对一的,所以不适用于广播和多播。那么什么是字节流服务?我们在这里主要与数据报服务作区分。对应到实际编程中,体现为通信双方是否必须执行相同数据的读写操作。TCP有一个...

2019-03-16 23:53:58 365

原创 守护进程

守护进程(也叫精灵进程):是指那些长时间运行在服务器上的进程,在后台执行,不需要与用户直接交互的进程,在Windows上叫做服务。守护进程的编程流程:1,首先fork()产生一个子进程,退出父进程 2,setsid(); 3,再fork(),退出父进程[可选] 4,改变当前工作路径; 5,umask 清除掩码; 6,close关闭文件描述符(若有僵尸进程则要处理僵死进程)为什么...

2019-03-16 00:14:29 296

原创 HTTP报文头部字段信息

HTTP请求:报文段如下:GET http://www.baidu.com/index.html HTTP/1.0   //目标资源的url  index.html表示指定资源文件的名称  HTTP/1.0表示客户端使用的版本号User-Agent :Wget/1.12 (linux-gnu)  //表示客户端使用的程序是WgetHost : www.baidu.com  ...

2019-03-15 00:04:51 4856

原创 编译链接的过程做了什么

一个.c文件变成可执行文件,一共经历了以下几个过程:预编译,编译,汇编,链接。预编译阶段(预编译之后生成.i文件)主要处理那些源代码文件中以“#”开始的预编译指令,例如#include,#define等。主要规则如下:1,删除所有的#define,展开所有的宏定义; 2,处理所有的条件预编译指令,如#if,#ifdef,#elif,#else,#endif 3,处理#include...

2019-03-13 23:36:09 1493

原创 内核空间的内存管理

一 ,内核管理内存的方式(1)内核把物理页作为内存管理的基本单位,内存管理单元通常以页为单位进行处理,所以,从虚拟内存角度来看,页就是最小单位。大多数32位系统支持4kb的页,64位系统支持8kb的页。(2)内核用这个结构体表示并管理系统中每个物理页。(3)由于硬件的限制,内核需要把页划分为不同的区,形成不同的内存池,根据用途进行分配。其中ZONE_DMA 物...

2019-03-13 21:25:34 957

原创 MySQL数据库SQL语句小结

数据库指的是文件的集合,操作这个集合需要用到SQL语句,SQL语句是由socket连接的。一,启动数据库:Linux下启动服务器进程:进入管理员身份,执行 service mysqld start,然后执行 mysql -u root -p,如果有密码的话则输入密码,无密码就直接enter。由上图信息可知数据库的版本和版权,选择帮助方式,命令结尾以';'或者'\g'结尾...

2019-03-13 19:00:49 439

原创 I/O复用的方式之二poll和epoll

来自《Linux高性能服务器编程》一,poll系统调用和select系统调用类似,也是在一段时间内轮询看文件描述符上是否有时间就绪。poll的原型如下:#include&lt;poll.h&gt;int poll( struct pollfd * fds,nfds_t nfds,int timeout);fds是一个pollfd结构类型的数组,它指定所有我们感兴趣的文件描述符...

2019-03-13 09:54:15 144

原创 I/O复用的方式之一select系统调用

来自《Linux高性能服务器编程》I/O复用是用来解决监听多个描述符上是否有就绪事件的系统调用。具体包含以下几种情况:客户端程序同时处理多个监听套接字socket;客户端要同时处理用户输入和网络连接;Tcp服务器要同时处理多个描述符;服务器要同时处理TCP请求和UDP请求;服务器要同时监听多个接口等。select系统调用:在一段时间内,监听用户感兴趣的文件描述符上的可读,可写,异常等事件。...

2019-03-12 23:57:07 286

原创 数组和指针的区别与联系

指针和数组基本等价的原因在于指针算术和C++内部处理数组的方式。整型变量加一后,其值将增加一;而指针变量加一后,增加的量等于它指向的类型的字节数;此外,C++将数组名解释为地址。多数情况下,C++将数组名解释为数组首元素的地址。对于数组加下标的形式,例如arr[1],C++编译器将其看作是*(arr + 1),如果使用的是指针,C++执行同样的操作。因此多数情况下我们可以以相同的方式使用指...

2019-03-11 09:46:51 635

原创 简单通用内存池及其实现

内存池的基本概念:所谓池,就是一组资源的集合,内存池,就是内存的一个集合。内存池的存在,可以解决频繁的new和delete产生的系统外碎片的问题,还能解决频繁申请空间频繁释放的效率问题。我们知道,每次new一块空间时,系统都要在内存空闲表中间查找一块空闲的内存分配给申请者,引入内存池的概念后,我们可以事先向系统申请一块比较大的内存作为一类内存的集合,每当我们再次向系统申请空间时,都在内存池中找到并...

2019-03-10 23:57:58 187

原创 C++内联函数

常规函数调用的时候,执行到函数调用指令时,程序将在函数调用后立即存储该指针的内存地址,并将函数参数复制到堆栈(为此保留的内存块),跳到标记函数起点的内存单元,执行函数代码,然后跳回到地址被保存的指令处。来回跳跃并记录跳跃位置,意味着将会需要一定的开销。C++内联提供了另一种选择。即编译器将使用一定的函数代码来替换函数调用。对于内联函数,程序无需跳到另一个位置处执行代码并跳回来,因此,内联函数运...

2019-03-07 17:06:58 71

原创 C语言的关键字

一,表示数据类型的关键字1,char   表示字符类型,一个字节2,short   短整型数据 ,两个字节3,int     基本整型数据,四个字节4,long    长整型数据,四个字节5,signed    有符号数据6,unsigned  无符号数据7,double  双精度浮点型数据  不能进行位运算(因为各个位代表的意义不一样)8,float     单精...

2019-01-19 12:56:55 225

原创 String类的写时拷贝

假设我们现在有这样一个类,当我们只是为了查询时,实现拷贝构造函数时就可以实现浅拷贝;仅当我们要对生成的对象进行修改时,才进行深拷贝,这样可以很节省空间,也能提高效率。可是如果这样的话,多个浅拷贝,析构时就会导致程序崩溃。因此我们可以自己实现一个析构函数,引入引用计数,当有新的对象生成时,引用计数置为零;之后每拷贝构造产生一个新的对象时,我们使用浅拷贝,引用计数加一;析构函数首先引用计数减一,然后...

2018-11-27 15:59:18 390

原创 函数的模板

首先了解什么是模板:在C语言中如果我们想实现一个函数供客户使用,需要考虑到各种情况,拿一个两数相加的函数来说,我们就不能为其指定数据类型,所以我们通常有以下几种实现方法:1,利用C语言中的泛型,即void*来实现。2,利用函数重载来实现。3,利用宏函数来实现。在c++中,我们可以通过模板来实现。例如:template&lt;typename T&gt;T Sum(T...

2018-11-27 15:40:22 120

原创 函数的默认值以及函数模板的默认值

在c++中,可以为函数的形参设置默认值。例如,如果我们想写一个求三角形周长的函数,我们可以这样写:int Sum(int a,int b,int c){ return a+b+c;}这个函数可以求三条边都为未知的三角形的周长。如果我们已知其中一条边,比如说其中一条边是10,不想每次都把这条边的值传递进去的话,我们就可以这样写:int Sum(int a,int b,int...

2018-10-11 09:04:04 998

原创 函数的重载与可变参函数

函数的重载:函数重载是一种特殊情况,指用同一范围内功能类似的同名函数完成不同的运算功能。常用来处理功能相似而数据类型不同的问题。重载函数的形式参数必须不同,具体包括参数个数,参数类型或参数顺序。重载函数的返回值可以不同。重载函数的运行环境:C++编译器eg:intMax(float ,float)//求最大值函数     int Max(int ,int ,int)     int mMax(in...

2018-03-24 08:08:00 432

原创 变量的存储空间以及作用域

Windows下栈的大小约为1M,堆的大小大于1GLinux下栈的大小约为10Mextern int g_c;//引用外部符号static int g_d;//内部属性,对外不可见

2018-03-20 20:37:31 169

原创 文件函数

(老师上课讲的)把一个文件中所有大写字母转换成小写字母//交换两个数,不用临时变量void main(){ int i = 10; int j = 20; //i = i + j;  //30 //j = i - j; //10 //i = i - j; //20 i = i ^ j; j = i ^ j; i = i ^ j;

2018-03-20 20:22:50 148

原创 C语言小知识点总结

1&lt; &gt;的头文件与" "头文件的区别:前者会现在系统路径下找声明,找不到则报错;而后者会现在用户路径下找声明,找到则引入,找不到则去系统路径下找2switch与if else的区别:在四分支以前无明显区别,在四分支以后switch的效率大于if else的效率,四分支以后,switch会生成一个转换表。3为什么每条case后面都要加break:switch语句...

2018-03-20 19:43:45 128

原创 算法的时间复杂度

计算一个算法的时间复杂度,就是计算程序需要运行多长时间。通常用大写的O符号来表示,最终只保留最高阶项且省略系数,考察在输入值趋近无穷时的所用时间。O(n)表示渐进时间复杂度,o(n)表示最坏时间复杂度计算方法:1、确定算法中各语句的执行次数,2、确定其数量级,数量级一般包括:1,log(2)n,n^2,n^3,2^n,n!等eg1:int fun...

2017-12-08 20:20:15 392

原创 关于c语言中的运算符及注意事项

( ),小括号,用来提升优先级[ ],用于数组下标/,除法,注意:int类型中整除取整(去尾)自增自减运算符前置++:先自增一前置--:先自减一后置++:后加一后置--:后减一位运算符(针对二进制)10:0000 101013:0000 1101①~ 按位取反  :对二进制的每一位取反~10:1111 0101~13:1111 0

2017-11-29 23:38:33 1586

原创 浮点数表示方法

浮点数     float类型    共有四个字节,32位浮点数的最高位表示符号,0表示正,1表示负。接下来的8个位用来表示指数,最后的23位表示尾数地址        +0                           +1                          +2                            +3 内容    SEEE EEEE

2017-11-28 22:52:51 3773 1

原创 指针的算数运算(指针加减数字、指针减指针)

1、指针加减数字是合法的指针加减数字表示的意义是指针在数组中位置的移动指针加减法规则指针加减法需要调整,调整的权重是指针本身去掉一个*,再求sizeof()eg:int main(){//指针减数字int *p = (int *)0x1010;//定义一个整型指针变量p赋值为16进制数0x1010printf("%x\n",p-1);//100c 去掉一个*,属...

2017-11-28 09:49:22 9139

原创 地址和指针区别与联系

1、在数组中,传入的数组参数表示的是数组首元素的地址,地址就是保存一个数据的位置,可以理解为门牌号,数据可以理解为屋里的人。c语言中常常使用的指针,也就是地址。2、表示指针的符号是*,除此之外它还有两种意义,一个是两数乘积,一个是解引用。3、解引用也叫间接访问符,意思是数据跳到上一层,中间略过一层。eg:int main(){ int a = 10; int b = ...

2017-11-27 13:51:01 1452

原创 求完数

1.给出一个数判断是不是完数2.将输出格式打印成 完数=因子1+因子2+……  的格式3.给出一个范围,求出其中所有的完数以下是代码#include //判断完数bool  IsPerfect(int  n)//自己定义的函数首字母大写,以免与库中的函数重名{int  tmp = 0;//定义一个临时变量for(int i = 1;i

2017-11-27 13:14:05 654

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除