C++
文章平均质量分 53
牧童遥指杏花村丫
这个作者很懒,什么都没留下…
展开
-
堆栈调用方式
ebp:栈底指针寄存器esp:栈顶指针寄存器eax:累加寄存器ebx:基地址寄存器:在内存寻址时 存放基地址esi/edi:源/目标索引寄存器ecx:计数器1、返回:返回值是怎么带出来的?答:eax寄存器(四个字节) (8个字节)2个寄存器带出 eax ebx2、函数调用后怎么知道回到调用方?答:在被调用一开始压入调用方的栈底该指针寄存器e原创 2017-12-21 10:42:27 · 391 阅读 · 0 评论 -
普通内存池的实现
内存池的实现:数据结构部分是用的静态链表 类和模板实现代码示例:#include <iostream>using namespace std;const int MEM_POOL_SIZE = 10;template<typename T>class Queue{public: class QueueItem...原创 2018-03-04 18:57:58 · 245 阅读 · 0 评论 -
通用内存池的实现
代码示例:#include<iostream>using namespace std;const int MEM_POOL_SIZE = 5;template<typename T>class MEM_POOL{public: void* alloc(size_t size) { if (pool == NULL) { int allocs...原创 2018-03-04 19:22:45 · 298 阅读 · 0 评论 -
C++ 继承与多态
1、继承的本质:代码的复用2、继承方式:public、protected、private 默认为private3、类与类的关系(1)组合:a part of/has a(2)继承:a kind of/is a(3)代理:容器适配器4、派生类继承了基类的什么?答:派生类继承了除基类的构造函数、析构函数之外的所有成员和成员函数,还继承了基类的作用域。5、派生类对象的构造方式答:先构造从基...原创 2018-03-29 17:43:10 · 491 阅读 · 0 评论 -
C++ 四种类型强制转换
C++的四种类型强转 分别是const_cast、static_cast、dynamic_cast、reinterpret_cast一、const_cast const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。1、用法const_cast&l...原创 2018-03-20 12:47:05 · 448 阅读 · 0 评论 -
单例模式的内存池
可以参照之前的两篇博客《普通内存池的实现》、《通用内存池的实现》单例模式的实现:(1)构造函数写在私有成员里面(2)有一个静态的成员函数用来生成一个唯一的对象代码实现:#include <iostream>using namespace std;const int MEM_POOL_SIZE = 5;template<typename T>class MEM_P...原创 2018-03-14 17:10:10 · 453 阅读 · 0 评论 -
C++ 设计模式之抽象工厂模式
1、问题假设我们要开发一款游戏, 当然为了吸引更多的人玩, 游戏难度不能太大(让大家都没有信心了, 估计游戏也就没有前途了),但是也不能太简单(没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略: 为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏, 每个关卡都有一些怪物(monster) 守着, 玩家要把这些怪物干掉才可以过关。 作为开发者, 我们就不得不创建怪物...原创 2018-04-14 18:56:03 · 213 阅读 · 0 评论 -
C++ 设计模式之工厂模式
上一篇博客写的简单工厂模式简单工厂模式的缺点是当新增产品的时候就要去修改工厂的类,这就违反了开放封闭原则,(类、模块、函数)可以扩展,但是不可以修改,于是,就出现了工厂方法模式。所谓工厂方法模式,是指定义一个用于创建对象的接口,让子类决定实例化哪一个类。打个比方现在有A、B两种产品,那么久开两个工厂。工厂A负责生产A产品,工厂B负责生产B种产品。代码实现:#include <iostream...原创 2018-04-14 18:44:34 · 159 阅读 · 0 评论 -
C++ 设计模式之简单工厂模式
1、简单工厂模式的设计思想首先将需要创建的各种不同对象的相关代码封装到不同的类中,这些类称为产品类,而将它们公共的代码进行抽象和提取后封装在一个抽象产品类中,每一个具体产品类都是抽象产品类的子类;然后提供一个工厂类用于创建各种产品,在工厂类中提供一个创建产品的工厂方法,该方法可以根据所传入的参数不同创建不同的具体产品对象;客户端只需调用工厂类的工厂方法并传入相应的参数即可得到一个产品对象。2、简单...原创 2018-04-14 18:11:37 · 319 阅读 · 0 评论 -
C++ 多继承、菱形继承、虚继承
先给大家看一下菱形继承的结构:D是多继承 有两个或两个以上的基类class A{public: A(int a = 0) :ma(a) { cout << "A" << endl; }public: int ma;};class B : public A{public: B(int b) :mb(b),A(b) { cout <&...原创 2018-04-10 22:30:12 · 223 阅读 · 0 评论 -
C++智能指针之shared_ptr
shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针, 当然这需要额外的开销: (1) shared_ptr 对象除了包括一个所拥有对象的指针外, 还必须包括一个引用计数代理对象的指针。 (2) 时间上的开销主要在初始化和拷贝操作上, *和->操作符重载的开销跟auto_ptr是一...原创 2018-04-24 18:32:19 · 284 阅读 · 0 评论 -
C++ 设计模式之观察者模式
C++ 设计模式之观察者模式Observer 模式应该可以说是应用最多、影响最广的模式之一,因为 Observer 的一个实例 Model/View/Control(MVC) 结构在系统开发架构设计中有着很重要的地位和意义, MVC实现了业务逻辑和表示层的解耦。 个人也认为 Observer 模式是软件开发过程中必须要掌握和使用的模式之一。在 MFC 中, Doc/View(文档视图结构)提供了实...原创 2018-05-10 16:43:20 · 268 阅读 · 0 评论 -
C++STL 空间配置器allocator
先来介绍一下STL的六大组件1. 空间配置器:内存池实现小块内存分配,对应到设计模式--单例模式(工具类,提供服务,一个程序只需要一个空间配置器即可),享元模式(小块内存统一由内存池进行管理)2.迭代器:迭代器模式,模板方法3.容器:STL的核心之一,其他组件围绕容器进行工作:迭代器提供访问方式,空间配置器提供容器内存分配,算法对容器中数据进行处理,仿函数伪算法提供具体的策略,类型萃取 实现对自...原创 2018-05-10 17:18:02 · 406 阅读 · 0 评论 -
C++ STL函数绑定器
代码示例:#include <iostream>#include <map>#include <vector>#include <algorithm>#include <functional>#include <string>using namespace std;/*1.函数接配器bind1st bi...原创 2018-05-10 17:40:47 · 674 阅读 · 0 评论 -
gcc和g++的区别
首先,gcc和g++都是GNU(组织)的一个编译器。1、后缀为.c的文件,gcc会把它当做C程序,g++会当做C++程序; 后缀为.cpp的文件,gcc和g++都会当做C++程序。2、编译阶段:g++会调用gcc程序3、链接阶段:由于gcc命令自动和C++程序使用的库链接,所以通常用g++完成链接...原创 2018-06-19 16:25:36 · 256 阅读 · 0 评论 -
指针和引用的区别
问题:指针与引用的区别?1.非空区别 在任何情况下都不能使用指向空值的引用,一个引用必须总是指向某些对象(引用必须初始化)。因此如果你使用一个变量并让它指向一个对象,但是该变量在有些时候也可能不指向任何对象,这时你就应该把变量声明为指针,因为这样你就可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你设计不允许变量为空,只是你就可以把变量声明为引用。不存在指向空值的引用...原创 2018-07-20 10:36:21 · 224 阅读 · 0 评论 -
new/delete和malloc/free的区别
1、属性new/delete 是关键字malloc/free是库函数2、参数(是否需要指定内存大小)new动态申请内存时,不需要指定内存块的大小int *p = new int;mallo动态申请内存时,需要显示指定内存的大小int *p = (int*)malloc(sizeof(int));3、返回值(返回类型安全性)new内存分配成功时,返回的是对象类型的指针,是符合类型安全的操作符mall...原创 2018-07-15 16:59:49 · 348 阅读 · 0 评论 -
STL不同容器的优缺点
一、容器的分类1、序列容器(1)vector典型的序列容器,任意元素的读取、修改具有O(1),在序列尾部进行插入、删除是O(1),但在序列的头部插入、删除的时间复杂度是O(n),可以在任何位置插入新元素,有随机访问功能,插入删除操作需要考虑。(2)deque序列容器,内存也是连续的,和vector相似,区别在于在序列的头部插入和删除操作也是O(1), 可以 在任何位置插入新元素,有随机...原创 2018-07-29 18:41:10 · 1214 阅读 · 0 评论 -
STL(标准模板库)概述
1、容器(1)顺序容器(2)vector 可以进行插入的操作:push_back(尾插)、insert(按位置插)(3)deque 可以进行插入的操作:push_back、push_front、insertvector和deque有[]运算符的重载函数,list没有,因为list底层是一个双端队列。(4)list 可以进行插入的操作:push_back、p...原创 2018-03-01 19:51:22 · 211 阅读 · 0 评论 -
用模板实现冒泡排序
代码实现:#include <iostream>using namespace std;#include <stdlib.h> //包含rand()的头文件template<typename T,int SIZE>//SIZE是非类型参数 非类型参数本身就是常量void sort(T array[]){ int i = 0; int j = 0...原创 2018-02-21 13:41:07 · 691 阅读 · 0 评论 -
C++中预处理、编译、汇编、链接 .cpp-------->.exe
C++中预处理、编译、汇编、链接 .cpp-------->.exe一、编译阶段1、预编译 --->.i(1)展开头文件(2)替换#define(3)删除注释(4)添加行号(5)保留#pragma(6)删除宏:#if #endif2、编译 --->.s(1)词法分析(2)语法分析(3)语义分析(4)代码优化3、汇原创 2017-12-21 10:55:57 · 247 阅读 · 0 评论 -
C/C++的区别(默认值、内联函数、函数重载、const、引用、参数、返回值)
一、默认值1、C语言C89标准无默认值C99标准有默认值最新的标准:C112、C++C++99标准C++11标准从右向左依次给出默认值参数的默认值只能给1次 例:int Sum(int,int);int main(){Sum(10,20);Return 0;} 编译时√链接出错:因为函数没有定义(实现),符号解析出错原创 2017-12-21 12:35:16 · 366 阅读 · 0 评论 -
C/C++动态申请二维数组的区别
C/C++动态申请二维数组的区别紧接着上一篇C++博客,这篇继续写到C/C++关于动态申请二维数组的区别。1、C语言中动态申请二维数组二维数组的开辟:先开辟二维,再开辟一维。代码核心实现: //动态申请 int arr[10][10]; int **arr = (int **)malloc(sizeof(int *)原创 2017-12-24 18:53:35 · 397 阅读 · 0 评论 -
C++中的名字空间namespace
名字空间namespaceC++中的4个作用域1、全局作用域2、局部作用域3、名字空间作用域4、类作用域同名的空间作用域会合并#include using namespace std;int gdata = 10;namespace A{ int gdata = 11; int Sum(int a,int b) { retu原创 2017-12-24 19:29:38 · 253 阅读 · 0 评论 -
类和对象及类中的六个默认的函数
一、面向对象的三大特征1、封装2、继承3、多态二、类和对象的区别答:类是抽象的,对象是具体的,所以类不占用内存,而对象占用内存。三、类和struct的区别(1)struct中默认为public(2)类中默认为private四、生成对象的2步(1)申请内存(2)使用构造函数进行初始化五、销毁对象的2步(1)调用析构函数释放对象所占的资源(2)把内存归还给内核六、封装体现在哪?——三个访问限定符1、p...原创 2018-01-21 20:09:42 · 335 阅读 · 0 评论 -
C++STL容器
一、迭代器的概念(1)迭代器类似于指针类型,它也提供了对对象的间接访问(2)指针是C语言中就有的东西,而迭代器是C++中才有的(3)迭代器提供一个对容器对象或者string对象访问的方法,并且定义了容器范围二、关于迭代器和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员,比如,容器都有的成员begin和end,其中begin成员原创 2018-01-31 22:16:46 · 233 阅读 · 0 评论 -
C++实现带头结点的单链表(友元类)
代码实现 单链表的头插和尾插 #include using namespace std;class Node{ public: Node(int data, Node* next = NULL)//构造函数 { mdata = data; pnext = next; } //不用写析构函数 因为头结点是在栈上开辟的 //不需要手动去释放 所以不原创 2018-01-20 18:23:42 · 918 阅读 · 0 评论 -
C++用模板实现单链表
用模板实现单链表话不多说 直接上代码#include using namespace std;templateclass CLink;templateclass Node{ friend class CLink; public: /* 构造函数和析构函数一般不加类型参数 本类类中除了构造函数和析构函数以外 其它的地方都要加上类型参数 */ Node(原创 2018-01-25 10:55:02 · 685 阅读 · 0 评论 -
C++用模板实现单链表(类外实现)
这一篇可以和上一篇 点击打开链接 模板实现单链表进行对比 看类外实现和类内实现的区别代码:#include using namespace std;templateclass CLink{public: class Node; CLink();//无参的构造函数 void InsertHead(T data);//头插 void InsertTail(T d原创 2018-01-25 11:20:26 · 2450 阅读 · 1 评论 -
类模板的完全特例化和非完全特例化
有关类模板和函数模板的一些概念:1、函数模板不支持模板参数给默认值(C99标准),类模板支持参数给默认值。2、类模板有选择性实例化。3、类中部分函数特例化时,一定要提供成员方法的模板。4、成员方法的特例化不能在类外定义(语法不支持)。5、类模板不能进行模板的实参推演,实参推演只针对函数模板。6、出了编译器自动生成的成员函数之外,其他成员方法的模板完全可以代替普通的成员方法。代码示例:#includ...原创 2018-02-27 12:38:45 · 835 阅读 · 0 评论 -
C++运算符重载详解
一、为什么要运算符重载C++预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型(类)是没有办法操作的,但是大多时候我们需要对我们自己定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。二、运算符重载的实质实质:函数重载或者函数多态三、运算符重载的规则1、运算符重载不能改变运算符的优先级这样会导致原创 2018-02-07 23:40:51 · 465 阅读 · 0 评论 -
C++复数类的实现
代码实现:#include <iostream>using namespace std;class Complex{public: Complex(int real = 0,int image = 0) :mReal(real),mImage(image){}//构造函数 //复数与整数的+-*/ const Complex operator+(int rh...原创 2018-02-08 12:46:40 · 493 阅读 · 0 评论 -
C++中String类的实现
要注意字符串是否为空代码实现:#include <iostream>using namespace std;#include <string.h> class CString{public: CString(char* p = "")//构造函数 { mstr = new char[strlen(p) + 1](); strcpy(mstr, p...原创 2018-02-18 20:26:20 · 203 阅读 · 0 评论 -
写时拷贝实现String类
写时拷贝技术是通过"引用计数"实现的,在分配空间的时候多分配4个字节,用来记录有多少个指针指向块空间,当有新的指针指向这块空间时,引用计数加一,当要释放这块空间时,引用计数减一(假装释放),直到引用计数减为0时才真的释放掉这块空间。当有的指针要改变这块空间的值时,再为这个指针分配自己的空间(注意这时引用计数的变化,旧的空间的引用计数减一,新分配的空间引用计数加一)。写时拷贝实现String类代码实...原创 2018-03-14 17:30:57 · 251 阅读 · 0 评论 -
C++对象的生存周期
例题:请给出下面对象创建过程中涉及的方法打印#include <iostream>using namespace std;class Test{public: Test(int a=5, int b=5):ma(a), mb(b) { cout<<"Test(int, int)"<<endl; } ~Test() ...原创 2018-01-27 11:33:33 · 342 阅读 · 0 评论 -
常对象、常成员函数、静态成员函数、静态成员变量
一、const1、常对象只能调用常成员函数2、普通对象可以调用全部的成员函数包括常成员函数3、常方法不能调用普通方法 可以调用常方法、静态成员方法4、普通方法可以调用常方法解释:当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;在X类的const...原创 2018-01-21 20:28:14 · 1548 阅读 · 0 评论 -
C++中关于临时量和临时对象
一、临时量的生成1、内置类型产生的临时量:常量 不可更改2、自定义类型产生的临时量:变量 可以更改3、隐式产生的临时量:常量二、返回值1、返回内置类型的时候,产生的都是寄存器的立即数2、返回自定义类型的时候,也是通过寄存器返回的,但是用指针或者引用来接收返回值时,编译器会自动产生临时量3、返回对象时,一律产生临时量,并把临时量的地址作为实参传递进去,被调用函数通过访问ebp+8就能够访问临时量的地...原创 2018-02-20 12:34:19 · 1013 阅读 · 1 评论 -
实现统计字符串中第一个空字符前面的字符长度——递归
举例:char buf[] = { 'a', 'b', 'c', 'd', 'e', 'f', '\0', 'x', 'y', 'z' };字符串buf,当输入n=10或者20时,期待输出结果为6;当输入n=3或者5时,期待输出结果为3或者5。 代码实现:#include <iostream>using namespace std;//统计字符串中第一...原创 2018-08-20 12:04:14 · 507 阅读 · 0 评论