c++学习
文章平均质量分 77
L_XRUI
one day one day one day......
展开
-
C++中类的构造函数
构造函数:1.定义:是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,在对象的生命周期内只且只调用一次,以保证每个数据成员都有一个合适的初值。如:class Data{public: Data(int year,int month,int day) { _year=year; _month=month; _day=day; }private:原创 2016-09-26 22:54:24 · 765 阅读 · 0 评论 -
继承与多态虚函数分析
此处举例在VS2010中编译:分析继承与多态在内存中的分配过程,直接以多继承举例:首先说明虚表的概念:虚表1.继承中没有虚函数,举例:class Base1{public: void Func1() { cout<<"Base1"<<endl; }public: int _a;};class Base2{public: void Func2() {原创 2017-03-16 19:23:47 · 841 阅读 · 0 评论 -
局部、局部静态、全局、全局静态变量联系区别
局部、局部静态、全局、全局静态变量联系区别:首先明白6大作用域:全局作用域、局部作用域、文件作用域、命名空间作用域、语句作用域、类作用域1.从作用域区别:局部与局部静态变量作用与局部作用域;全局变量作用与全局作用域,若一个程序中有多个源文件,它定义与一个源文件,即所有文件都可以通过extern关键字使用全局变量,链接属性为外部;全局静态变量则作用与文件作用域,即当程序中有多个源原创 2017-03-27 14:18:30 · 968 阅读 · 0 评论 -
内存池的实现
根据C++STL中的空间配置器,实现一个轻量级的内存池,由于空间配置器虽然解决了外部碎片的问题,提高了效率,但它的缺陷在于若使用二级空间配置器,它不会主动释放已经空闲的内存块,还给操作系统,而是将自己申请的内存块全部挂在自由链表上,自己不用,别的进程也不可以用,造成极大的内存空间的浪费,很可能导致很多别的进程无内存可用的情况。而轻量级的内存池不仅解决外部碎片问题,并且解决释放内存问题,它使用多少用原创 2017-04-18 16:48:00 · 938 阅读 · 0 评论 -
C语言实现继承与多态
在前面博客已经详细讲过C++中继承与多态的概念,在这里则只使用C语言的语法来实现继承与多态。继承:即派生类中拥有基类的成员变量和成员函数,所以C语言实现如下:#include typedef void(*Func)(void);void funB(){ printf("B::funB()\n");}typedef struct B{ int _b; Func _fb原创 2017-04-18 19:21:54 · 982 阅读 · 0 评论 -
C++如何只能在堆上或栈上生成对象
#include using namespace std;//只能在栈上构造对象的实现:即不能调用new来在堆上构造对象,调用new其会调用operator new(),//所以只要显示定义重载一下operator new() operator delete()操作符设为私有部分//类外就无法调用new/delete在堆上建立释放对象了。class B{public: B()原创 2017-06-21 21:12:18 · 934 阅读 · 0 评论 -
单例模式的实现
#include using namespace std;//单例模式:即单个实例的模式(面向对象,一个类只允许产生一个实例,自行实例化,并提供全局的访问方法)//分类://1.饿汉单例:在使用前对象已创建完成,即使还未使用对象,其也一直存在//实现:用一个已初始化的静态对象指针,用一个接口提供其给用户使用,再将构造函数设为私有,//所以用户只能使用这个接口得到这个对象,由于此成员对象原创 2017-06-23 19:03:02 · 770 阅读 · 0 评论 -
宏总结
宏即代码替换,它可以替换数值字面值常量,字符串等非整型以及函数替换。如:#define MAX 1024 #define STRING "stringstring"#define SWAP(a,b) {a=a+b;b=a-b;a=a-b}1.宏的执行速度较快,一个程序到执行经过四个步骤,预处理、编译、汇编、链接,而宏则在预处理阶段已经将其代表的代码替换到程序中了;对于函数每次执原创 2017-04-19 15:19:40 · 904 阅读 · 0 评论 -
多态概念总结
以下全部总结讲解或代码举例在VS2010编译器下进行:一、基本概念多态:具有多种形式或形态的情形(最初来源于希腊语,在C++中有广泛的含义)。多态分类图:静态多态:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型的转换),可推断出要调用哪一个函数,如果有对应的函数就调用该函数,否则出现编译错误。举例如上图函数重载实现静态多态:class A{publ原创 2017-03-17 17:36:02 · 3183 阅读 · 0 评论 -
string类写时拷贝的模拟实现
为了解决string类中浅拷贝的问题,在windows系统下它则以深拷贝来解决这一问题,由于深拷贝要不断的开辟内存空间,并花费时间,所以在linux/unix系统下则采用写时拷贝(Copy_On_Write)来实现:它依然以浅拷贝实现为主,以指针的值传递,但是它多加了引用计数,当多个对象指向同一块空间,引用计数则统计对象个数,当只是读的时候就不用开辟新的内存,析构时根据引用计数值是否为1判断是原创 2017-03-23 18:12:12 · 927 阅读 · 0 评论 -
String类深拷贝的模拟实现
深拷贝浅拷贝分析:浅拷贝:也称位拷贝,编译器只是直接将指针的值拷贝过来,结果多个对象共用同一块内存,当一个对象将这块内存释放掉之后,另一些对象不知道该块空间已经还给了系统,以为还有效,所以在对这段内存进行释放操作的时候,一个内存空间被释放多次,发生了访问违规,程序崩溃。如图:深拷贝:为了解决浅拷贝的问题,深拷贝则不是直接将指针的值拷贝,它是为指针p2开辟与p1相同大小的内存空间原创 2017-03-23 13:47:33 · 1167 阅读 · 7 评论 -
STL一级空间配置器
在STL中,空间配置器是容器必不可少的东西,它为容器中的数据提供空间存储,由于考虑小型区块可能造成的内存碎片问题,STL中设计了双层级配置器,当开辟内存>128bytes时,就会调用第一级配置器,在这里我们将根据其源码模拟实现它的第一级配置器。STL 第一级配置器代码实现:#pragma once//一级空间配置器#define __THROW_BAD_ALLOC 0t原创 2017-03-21 21:13:12 · 919 阅读 · 0 评论 -
C++类中this指针的说明
this指针:1.说明:当程序中一个类定义了多个对象,多个对象都调用类中同一个成员函数时,此时怎么区别这个成员函数在哪个对象上操作,C++提供了this指针。如:class Data{public: void SetData(int year,int month,int day) { _year=year; _month=month; _day=day; }priv原创 2016-09-26 21:38:52 · 2989 阅读 · 0 评论 -
日期计数器—C++实现
日期计数器实现:在程序中定义日期类:class Date{};,主要运用操作符重载知识在其中实现:日期加或减一定天数,日期减日期相差天数,两日期的各种比较与日期输入输出等功能。具体代码实现:#include #include using namespace std;class Data{ friend ostream& operator<<(ostream& _cout, con原创 2016-10-22 17:21:55 · 1521 阅读 · 0 评论 -
C++构造函数简单实现电梯控制程序
对于电梯,属性之一就是位置,所以要实现这一程序,要设置电梯的初始位置和按下电梯按钮改变的电梯的位置。代码如下:#include #include #include using namespace std;class Elevator{private: int currentFloor; //电梯所处位置public: Elevator(int cfloor=1);原创 2016-09-05 19:06:55 · 7110 阅读 · 0 评论 -
C++类的继承总结
一、继承概念:是面向对象程序设计使代码可以复用的重要手段,保持原有类特性基础进行扩展,增加功能,产生新的类,称为派生类。定义格式:三种继承关系:public,protected,private三种类成员访问限定符:public,protected,private(需要与三种继承关系区别,不能混淆)举一个简单类:B公有继承(public)与Aclass A{publi原创 2016-10-26 11:31:19 · 1221 阅读 · 0 评论 -
STL容器中list与迭代器iterator的模拟实现
list在容器中结构是有一个头结点_head,头结点指向第一个结点,尾结点指向头结点,它为双向循环链表,在其中它有自己的迭代器可以类似于智能指针,用于数据的访问和算法的配合。代码实现:#include #include #include #include using namespace std;template struct _ListNode //结点结构{ T原创 2016-12-30 16:03:55 · 2048 阅读 · 0 评论 -
哈夫曼树
哈弗曼树(Huffman tree):是最优二叉树,加权路径最短的二叉树。贪心算法:是指在问题求解时,总是做出当前看起来最好的选择,即为贪心算法做出的不是整体最优的选择,而是某种意义上的局部最优解,贪心算法不是对所有的问题都能得到整体最优解。思想:这里使用贪心算法构建哈弗曼树,运用最小堆的思想,建立最小堆,每次从堆中找最小的两个节点构造新结点,新结点再放回堆中,并连接两个旧的结点,按相同方原创 2017-01-29 17:25:24 · 898 阅读 · 0 评论 -
红黑树实现
红黑树:是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black。通过对任何一条从根到叶子简单路径上的颜色来约束,红黑树保证最长路径不超过最短路径的两倍,因而近似于平衡(由于性质中红色节点不连续,最短路径可为全是连续黑结点,最长路径则由于红节点不连续,则每间隔一个黑的插入一个红的节点,所以最长路径为两倍)。 它主要满足以下几个性质: 1. 每个节点,不是红原创 2017-02-15 23:20:39 · 772 阅读 · 0 评论 -
动态内存开辟:new/delete,malloc/free区别与联系
本博客主要说明new/delete,malloc/free的区别与联系,如下:1.malloc/free为C的标准库函数,函数原型为:void* malloc(size_t size)//参数代表字节个数void free(void* pointer)//参数代表内存地址new、delete则为C++的操作运算符,它调用的分别为赋值运算符重载operator new()和operator原创 2017-03-17 16:17:56 · 4266 阅读 · 1 评论 -
STL二级空间配置器
在前面博客已经实现了一级空间配置器,博客链接如下:http://blog.csdn.net/l_xrui/article/details/645008981.首先明白为什么需要二级空间配置器?我们知道动态开辟内存时,要在堆上申请,但若是我们需要不断的在堆上开辟小块内存,释放,开辟释放,则就会再堆上造成很多外部碎片,浪费了内存空间;并且由于每次都要进行调用malloc、free函数,原创 2017-03-27 20:30:26 · 913 阅读 · 0 评论 -
序列式容器:vector
vector:连续的线性空间,与array唯一的区别在于其空间的动态配置。其有自己的迭代器,由于它空间连续,所以不论其元素型别为何,普通指针可以作为vector的迭代器,如下:typedef T value_type;typedef value_type* iterator;typedef size_t size_type;typedef value_type& refer原创 2017-06-13 11:12:50 · 729 阅读 · 0 评论