C++
D_4_Y_
不后悔且快乐
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C/C++内存管理(下)
一、单例模式 1.设计模式: 设计模式是一套被反复使用、很多人知道的、经过分类的、代码设计经验的总结 目的:为了代码可重用性,让代码更容易被他人理解、保证代码可靠性。设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络。 ...原创 2019-03-21 15:53:25 · 204 阅读 · 0 评论 -
析构函数定义为虚函数
Q:析构函数为什么要定义为虚函数? 1.我们在之前的学习中都知道,在调用构造函数时先调用基类的构造函数,再调用派生类构造函数;而当调用析构函数时,则要先调用派生类的析构函数再调用基类的析构函数 #include<iostream> using namespace std; class A{ public: A(){ cout << "A()" << end...原创 2019-07-06 12:12:46 · 1453 阅读 · 0 评论 -
右值引用(移动构造+移动赋值)
一、概念 在学习本节的时候,常常会因字面意思而导致错误认知,因此我们首先来理清一些概念 左值:一般来讲在等号左边的都是左值,是可以被修改的值 右值:在等号右边的值不一定是右值!!!右值是不可以被改变的值,例如常量、临时对象、表达式返回值等 左值引用:例如int& lr=a;优点:在传值和传参的位置时使用,可以减少拷贝次数,提高运行效率 右值引用:例如int&& rr=a;...原创 2019-07-09 22:55:09 · 1104 阅读 · 0 评论 -
AVL树的旋转
一.AVL树的旋转 由于在插入新节点后可能会导致双亲的平衡因子变为2或-2,此时为了保证该树依然是AVL树,则要进行旋转;我们将AVL树的旋转分为左单旋,右单旋,左右双旋,右左双旋四种情况 情况一:左单旋 如果新节点插入在较高右子树的右侧,此时进行左单旋 在节点16的右侧插入节点后,根节点的平衡因子变为2,此时进行左单旋(降低右子树高度) 思想: parent变为subR的左子树,subRL变为...原创 2019-05-09 20:05:53 · 296 阅读 · 0 评论 -
AVL树
一.AVL树的概念 一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树 左右子树都是AVL树 左右子树高度之差(平衡因子)的绝对值不超过1 例如: 上面这棵树不是一个AVL树,因为节点16的平衡因子为2,超过了1,此时为了让它变成AVL树,则要进行旋转 2.AVL树节点的定义 template<class K,class V> struct AVLTreeNode { ...原创 2019-05-09 16:54:29 · 202 阅读 · 0 评论 -
类与对象(上篇)
1.类与对象的初步认知 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题 C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成 2.类的引入 c语言中,结构体中只能定义变量,在c++中,结构体不仅可以定义变量,也可以定义函数。在c++中更喜欢用class来代替结构体的定义。 3.类的定义 class className { ...原创 2018-11-12 21:27:47 · 204 阅读 · 0 评论 -
C/C++内存管理(上)
一、C/C++内存分布 计算机的内存是通过分区来进行管理的,但我们主要要了解的有四个区域,分别是:栈去、堆区、数据段(也叫静态区)、代码段 栈区:栈是一种先进后出的结构,非静态局部变量/函数参数/返回值一般存在这个区域,栈是向下增长的,函数传参时参数从右到左进栈; 堆区:用于动态开辟内存空间,堆是向上增长的; 静态区:存储静态变量和全局变量; 代码段:存储程序的可执行代码和只读常量; 二、C语言中...原创 2019-03-18 19:27:35 · 135 阅读 · 0 评论 -
string类
标准库中的string类 1.string类 string是表示字符串的字符串类 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作 string在底层实际是:basic_string模板类的别名 不能操作多字节或者变长字符的序列 2.string类的常用接口说明 string类对象的常见构造 string() /...原创 2019-03-18 20:06:50 · 355 阅读 · 0 评论 -
继承
一、继承的概念及定义 1.概念: 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,产生新的类,称派生类。 2.定义 定义格式 class Student : public Person { public: int _stuid; int _major; } Person是父类,也称作基类;Stu...原创 2019-03-19 14:46:39 · 141 阅读 · 0 评论 -
类与对象(中)
1.类的6个默认成员函数 如果一个类里面什么成员都没有,简称为空类。但是空类中并不是什么都没有,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。 6个默认成员函数 初始化和清理(构造函数主要完成初始化工作,析构函数主要完成清理工作) 拷贝复制(拷贝构造是使用同类对象初始化创建对象,赋值重载主要是把一个对象赋值给另一个对象) 取地址重载(主要时普通对象和const对象取地址,这两个...原创 2019-03-19 15:10:31 · 160 阅读 · 0 评论 -
多态
一、多态的概念 概念:通俗来说,就是多种形态,具体来说就是去完成某个行为,当不同的对象去完成时会产生出不同的状态 二、多态的定义及实现 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为 在继承中要构成多态还需要两个条件: 调用函数的对象必须是指针或者引用 被调用的函数必须是虚函数,且完成了虚函数的重写 1.虚函数:在类的成员函数前面加virtual关键字 2.虚函数的重写:派生类...原创 2019-03-20 16:37:09 · 144 阅读 · 0 评论 -
stack和queue
一、stack的介绍和使用 1.stack的介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取工作。 stack的底层容器可以是任何标准的容器类模板或者其他特定的容器类,这些容器应该支持empty、back、push_back、pop_back等操作 2.stack的使用 stack (const container_type&am...原创 2019-03-21 09:32:20 · 312 阅读 · 0 评论 -
二叉搜索树概念及实现
一.概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右子树也分别为二叉搜索树 二.二叉搜索树的操作 1.查找 若根节点不为空: 如果根节点key ==查找key,返回true 如果根节点key<查找key,在它的右子树查找 如果根...原创 2019-04-27 18:08:52 · 231 阅读 · 0 评论 -
vector
一、vector的介绍和使用 1.vector的介绍 vector是表示可变大小数组的序列容器 vector采用连续存储空间来存储元素,也意味着可以采用下标对vector元素进行访问,和数组一样高效。但是它的大小可以动态改变,而且它的大小会被容器自动处理 本质上来讲,vector通过动态分配数组来存储它的元素。当新元素插入时,这个数组需要被重新分配大小。为了增加存储空间,其做法是,分配一个新的数...原创 2019-03-22 12:39:07 · 213 阅读 · 0 评论 -
list
一、list的介绍及使用 1.list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点中,在节点中通过指针指向其前一个元素和后一个元素 与其他的序列容器相比,list通常在任意位置进行插入、移除元素的执行效率更好 与其他序列式容器相比,list和forward_list最大...原创 2019-03-22 16:00:26 · 163 阅读 · 0 评论 -
异常
一、C语言处理错误机制 终止程序,如assert;如发生内存错误、除0错误就会终止程序 返回错误码,需要程序员去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误 C标准库中setJmp和longJmp组合 二、C++异常概念 概念:异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接调用者处理这个错误 throw:当...原创 2019-03-26 14:01:46 · 165 阅读 · 0 评论 -
智能指针
一、为什么需要智能指针 1.malloc出来的空间,没有进行释放,会导致内存泄漏问题 2.异常安全问题,如果在malloc和free之间存在抛异常,那么也会出现内存泄漏问题 二、智能指针的使用及原理 1.RAII RAII是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等 )的简单技术 在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对...原创 2019-04-11 09:12:19 · 182 阅读 · 0 评论 -
模板进阶
一、非类型模板参数 模板参数分为类类型形参与非类型形参 类类型形参:跟在class或者typename之后的参数类型名称 非类型形参:用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用 浮点数、类对象以及字符串不允许作为非类型模板参数 非类型的模板参数必须在编译期就能确认结果 二、模板的特化 1.概念:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板...原创 2019-04-17 09:30:13 · 182 阅读 · 0 评论 -
map 和 set
一、set 1.set的简单介绍 set是按照一定次序存储元素的容器 set中的元素是不能被修改的,只能支持增、删、查(否则元素可能变为无序的) set中元素的value标识它,并且每个value必须是唯一的 2.功能 set的底层实际是一个搜索树 可以查找关键字在不在(find()接口) 排序+去重 int main() { set<int> s; s.insert(3...原创 2019-04-18 09:14:37 · 302 阅读 · 0 评论 -
C++类型转换
一、C语言中的类型转换 int main() { int i=1; double d=i; //隐式类型转换 printf("%d,%.2f\n",i,d); int * p=&i; int ar=(int)p; //显示的强制类型转换 printf("%x,%d\n",p,address); } 缺陷:转换的可视性较...原创 2019-04-18 11:32:51 · 243 阅读 · 0 评论 -
类型萃取
一、类型萃取(类模板特化应用) Q:如何实现一个通用的拷贝函数? 1.使用memcpy函数 template<class T> void Copy(T* dst,const T* src,size_t size) { memcpy(dst,src,sizeof(T)*size); } 上面实现虽然任意类型的空间都可以拷贝,但是自定义类型有可能涉及到深拷贝,而memcpy是浅拷贝...原创 2019-04-19 09:24:58 · 252 阅读 · 0 评论 -
模板的分离编译与总结
1.概念 一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式 2.模板的分离编译 假如我们将模板的声明定义分离开,在头文件中声明,源文件中定义: // a.h template<class T> T Add(const T& left,const T& right) //a....原创 2019-04-19 10:50:54 · 279 阅读 · 0 评论 -
多态的原理
一.虚函数表 class A { public: virtual void Func1() { cout << "A::Func1()" << endl; } virtual void Func2() { cout << "A::Func2()" << endl; } void Func3() { cout <<...原创 2019-04-23 12:19:49 · 303 阅读 · 0 评论
分享