
C++经验总结
hudfang
这个作者很懒,什么都没留下…
展开
-
两种消息模型: 点对点&&发布/订阅
点对点: 消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。这里要注意: 消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。 Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。 发布/订阅 消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topi...原创 2018-06-05 16:46:16 · 2426 阅读 · 0 评论 -
C++学习之函数模板
函数模板简单易懂的分析原创 2016-02-18 17:34:25 · 614 阅读 · 0 评论 -
C++学习之多态篇(异常处理)
一、异常处理概念:对有可能发生异常的地方做出预见性的安排,异常处理过程如下图所示:f1()出现异常,就会抛给调用者f2(),如果f2()处理不了就继续往上抛给它的调用者,依次类推。。。2.使用例子:因为 1是整数,所以catch里面的数据类型是int,如果想获得1的值,就穿int &原创 2016-02-03 15:28:19 · 1080 阅读 · 0 评论 -
C++学习之多态篇(运行时类型识别--RTTI(typeid和dynamic_cast))
1.使用方式:dynamic_cast的使用说明:(1)只能有用于指针和引用的转换,将父类指针或引用转换为子类指针和引用(2)要转换的类型中必须包含虚函数(3)如果转换成功,返回的就是子类的地址,如果转换失败,返回NULLtypeid的使用说明:(1)返回一个type_info对象的引用,type_info类的结构见下图:(2)如果想通过基类的指针获得派生类原创 2016-02-03 14:33:00 · 2920 阅读 · 1 评论 -
C++学习之多态篇(纯虚函数和虚函数的区别)
一、两者区别与联系1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用原创 2016-02-03 11:25:45 · 733 阅读 · 0 评论 -
C++学习之多态篇(纯虚函数和接口类)
1.纯虚函数形式2.纯虚函数内存结构分析:Shape类中有一个虚函数和纯虚函数,所以它肯定有一个虚函数表和一个虚函数表指针,在虚函数表中如果是一个普通的虚函数,那么这个虚函数的函数指针就是一个有意义的值,比如0x3355,如果是一个纯虚函数,那么这个值就是0。3.抽象类纯虚函数肯定是某个类的成员函数,包含纯虚函数的类就叫做抽象类。抽象类的特点:(1)因为纯虚函数无法原创 2016-02-03 11:11:11 · 4495 阅读 · 0 评论 -
C++学习之对象成员指针篇
所谓对象成员指针就是让一个类的对象的指针作为另外一个类的成员变量,对象成员就是让一个类的对象成为另一个类的成员变量。下面以代码举例说明:公用坐标类:class Coordinate{public:Coordinate(int x,int y);private:int m_iX;int m_iY;}(1)对象成员代码如下:class Line{pu原创 2016-01-14 18:32:13 · 1658 阅读 · 2 评论 -
C++学习之对象成员篇
对象成员特点总结:(1)实例化对象A时,如果对象A有对象成员B,那么先执行对象B的构造函数,再执行A的构造函数。(2)如果对象A中有对象成员B,那么销毁对象A时,先执行对象A的析构函数,再执行B的析构函数。(3)如果对象A中有对象成员B,对象B没有默认构造函数,那么对象A必须在初始化列表中初始化对象B。类A和B的关系就好比是汽车和零部件的关系,实例化类A就相当于产生汽车的过程,肯定原创 2016-01-13 16:21:33 · 856 阅读 · 0 评论 -
C++学习之拷贝构造函数篇
一、拷贝构造函数的声明Array(const Array & arr);二、拷贝构造函数的实现分为两种,即是深拷贝和浅拷贝。1.浅拷贝代码如下:class Array{public:Array(){m_iCount = 5; m_pArr = new int[m_iCount]; }Array(const Array& arr){m_原创 2016-01-13 17:44:09 · 972 阅读 · 3 评论 -
C++学习之对象数组篇
#include using namespace std;class Coordinate{ public:Coordinate(){}// 打印坐标的函数void printInfo() { cout}public:int m_iX;int m_iY;};int main(void){//定义对象数组原创 2016-01-13 15:57:37 · 416 阅读 · 0 评论 -
C++学习之多态篇(多态的几个特点)
1.虚函数特性可以被继承,当子类中定义的函数与父类中声明的虚函数相同时,(同名同参同返回值),该函数也是虚函数;用父类的指针指向子类的对象时,用该指针调用这个同名函数时,会去调用子类的该函数,这就是多态;2.虚析构函数是为了避免使用父类指针释放子类对象时造成内存泄露;3.在c++中多态的实现是通过虚函数表来实现的;4.每个类只有一份虚函数表,所有该类的对象公用同一张虚函数表;5.两原创 2016-01-28 17:58:13 · 1184 阅读 · 4 评论 -
sizeof与类的大小
1.当类中没有虚函数也没有成员变量的时候,这个类是一个空类,但是sizeof空类对象的大小,并不是为0,而是为1,即默认空类是有一个占位符的。例如:class A{}; sizeof(A) = 1;注意:sizeof是操作符而不是函数,作用是判断数据类型或着表达式长度,字节数的计算在程序的编译时进行,而不是在程序执行的过程中才计算出来。2.当类中只含有静态成员变量,如class A{sta原创 2016-01-28 17:37:04 · 1025 阅读 · 0 评论 -
c++学习之virtual的使用限制
1.不能修饰普通的函数,也就是所修饰的函数必须是某个类的成员函数,不能是全局函数。2.不能修饰静态的成员函数3.不能修饰内联函数4.不能修饰构造函数原创 2016-01-28 16:41:09 · 716 阅读 · 0 评论 -
C++学习之多态篇(虚函数和虚析构函数的实现原理--虚函数表)
通过下面的代码来说明:#include #include #include using namespace std;/** * 定义动物类:Animal * 成员函数:eat()、move() */class Animal{public: // 构造函数 Animal(){cout // 析构函数 vi原创 2016-01-26 18:13:55 · 3028 阅读 · 1 评论 -
C++学习之多态篇(虚析构函数)
动态多态有时候会产生内存泄露,如下图所示的代码:Circle类中有一个从堆中分配的类Coordinate的对象,这个对象必须在Circle的析构函数中销毁,并对堆内存进行回收,如果在main()函数中delete shape,而shape的析构函数没有声明为虚析构函数的话这句代码就只会调用shape类自己的析构函数,而不会调用Circle的析构函数,这样circle类含有的从堆中分配的Coor原创 2016-01-25 19:25:19 · 874 阅读 · 0 评论 -
C+学习之多态篇(虚函数)
一、什么事多态?多态的定义:相同对象收到不同消息或不同对象收到相同消息时产生不同的动作。二、多态分类:定义不太好理解,其实或字前后说明了两个不同类型的多态形式:即静态多态(早绑定)和动态多态(晚绑定)。1.静态多态(早绑定)看下图中代码:两个calcArea()函数互为重载,互为重载的函数在main()函数中调用的时候会根据参数的不同来调用各自的函数,这种调用关系是很早就确原创 2016-01-25 19:05:36 · 679 阅读 · 0 评论 -
C++学习之模板篇(类模板)
1.为什么要有类模板?是因为在很多使用场合下,一个类会被使用很多次,用的时候呢也发现很多重复的地方,只有它的数据类型不同,这个时候就要用到类模板。2.单参数类模板形式(1)声明形式单参数类模板形式如下,可见与函数模板比较,声明模板的方式相同,都是使用template,不同的是函数模板是参数中会使用类型T,而类模板是是数据成员会使用类型T,需要注意的是类模板中成员函数的声原创 2016-02-22 10:45:28 · 2604 阅读 · 2 评论 -
C++学习模板篇(静态数据成员与静态成员函数)
前面学过:普通数据成员和普通的成员函数常数据成员和常成员函数今天学习:静态数据成员和静态成员函数1.如何声明直接在普通的数据成员和普通的成员函数的前面加上static就成了静态的。静态成员变量属于类本身,而不属于某个对象,所以它不依赖于对象的实例化,不会在类的构造函数中初始化,它的初始化往往单独进行,如上图所示,初始化时不再加static关键字,必须定义在类外,原创 2016-02-22 18:09:11 · 3244 阅读 · 0 评论 -
STL
STL的最主要的两个特点:数据结构和算法的分离,非面向对象本质。访问对象是通过象指针一样的迭代器实现的;容器是象链表,矢量之类的数据结构,并按模板方式提供;算法是函数模板,用于操作容器中的数据。由于STL以模板为基础,所以能用于任何数据类型和结构。 一、STL简介STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由A原创 2016-11-02 14:29:39 · 403 阅读 · 0 评论 -
函数指针及应用
函数指针及应用我们先来看一下以下 的声明:int f(int);int (*pf)(int)=&f;//&操作符可选;因为函数名被使用时总是由编译器把它转换为函数指针;int ans;ans=f(25);ans=(*pf)(25);ans=pf(25);//间接访问操作并非必需,因为编译器需要的是一个函数指针;*********************转载 2016-11-01 16:21:35 · 367 阅读 · 0 评论 -
指针函数和函数指针
1.指针函数先看下面的函数声明,注意,此函数有返回值,返回值为int *,即返回值是指针类型的。[cpp] view plain copy print?int *f(int a, int b); int *f(int a, int b);上面的函数声明又可以写成如下形式: int* f(int a, int b);让指针标志转载 2016-11-01 15:56:48 · 393 阅读 · 0 评论 -
TCP/IP三次握手过程详解
一、TCP报文格式 图1 TCP报文格式上图中有几个字段需要重点介绍下: (1)序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。 (2)确认序号:Ack序号,占32位,只有ACK标志位为1时,确认序号字段才有效,Ack=Seq+1。 (3)标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体原创 2016-10-26 22:29:23 · 738 阅读 · 0 评论 -
常见面试题及答案汇总
1.堆栈溢出一般是由什么原因导致的?答:1.没有回收垃圾资源 2.层次太深的递归调用(无限递归调用),每一次函数调用都会将参数、返回值不停的压栈。2.new、delete、malloc、free的关系delete会调用对象的析构函数,和new对应。free只会释放内存。new会调用构造函数。malloc与free是C++/C语言的标准库函数,new和delete是C+原创 2016-10-26 16:17:49 · 965 阅读 · 0 评论 -
引用作为函数参数和常引用作为函数参数
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还原创 2016-10-26 15:17:55 · 6985 阅读 · 0 评论 -
stl容器的实现原理-与数据结构的对应关系
STL容器的实现原理 STL共有六大组件 1、容器。2、算法。3、迭代器。4、仿函数。6、适配器。 STL容器的实现原理STL来管理数据十分方便,省去了我们自己构建数据结构的时间.其实,STL的实现也是基于我们常见的数据结构.序列式容器:vector-数组,元素不够时再重新分配内存,拷贝原来数组的元素到新分配的数组中。转载 2016-10-26 14:40:00 · 5640 阅读 · 0 评论 -
stl中常用容器详解
我们常用到的STL容器有vector、list、deque、map、multimap、set和multiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。 verctor--会自动增长的数组vector类似于C语言中的数组,它维护一段连续的内存空间,具有固定的起始地址,因而能非常方便地进行随机存取,即 []原创 2016-10-26 14:32:23 · 399 阅读 · 0 评论 -
堆栈区别和堆栈溢出原因
好了,我们回到我们的主题:堆和栈究竟有什么区别?主要的区别由以下几点:1、管理方式不同;2、空间大小不同;3、能否产生碎片不同;4、生长方向不同;5、分配方式不同;6、分配效率不同;管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。空间大小:一般来讲在32位系统下,堆内存可以达到原创 2016-10-26 11:46:06 · 7339 阅读 · 0 评论 -
二叉排序树和平衡二叉树
二叉排序树又称二叉查找树,亦称二叉搜索树。二叉排序树或者是一颗空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;(2)若右子树不空,则右子树所有结点的值均大于或等于它的根结点的值;(3)左、右子树也分别为二叉排序树平衡二叉树:又称为AVL树,它具有以下特征:它是一棵空树或它的左右两个子树的高度差(称为平衡因子)原创 2016-10-26 11:28:59 · 4440 阅读 · 0 评论 -
全局变量与局部变量在内存中的区别
全局变量保存在内存的全局存储区中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。该题目考查的知识点是变量的存储类型及性质。C语言经过编译之后将内存分为以下几个区域:(1)栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。(2)堆(heap):用于程序原创 2016-10-26 10:26:30 · 829 阅读 · 0 评论 -
static有什么用途
在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数一、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点:(1)在全局数据区内分配内存(2)如果没有初始化,其默认值为0(3)该变量在本文件内从定义开始到文件结束可见。二、定义全局静态变量:在局部变量前面加上关键字static,该局部变量便成了静态原创 2016-10-26 10:08:59 · 6222 阅读 · 0 评论 -
SOLID
S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写。SRPThe Single Responsibility Principle 单一责任原则OCPThe Open Closed Principle开放封闭原则LSPTh转载 2016-04-12 17:59:04 · 551 阅读 · 0 评论 -
c++学习之构造函数和析构函数篇
1.对象结构:首先了解内存分区,如下图所示:2.对象结构举例说明:下面定义了一个汽车的类,在类被实例化之前是不会占用栈或堆中内存的,当被实例化后,比如实例化了三个对象,car1、car2、car3,这每一个对象都会在栈上开辟内存,来存储各自的数据,但它们各有一份变量,占据不同的内存,而逻辑代码只编译出了一份,放在代码区,当需要的时候代码区中的代码供所有的对象进行使用,谁需要的时候就原创 2016-01-08 17:29:09 · 1374 阅读 · 2 评论 -
C++学习模板篇之友元函数友元类
一、类的友元函数分为友元全局函数和友元成员函数两种类型。1.友元全局函数形式如下图所示,使用friend关键字加普通函数声明的方式来声明一个类的友元函数,与普通函数的区别还在于参数上,必须传递当前这个类的对象或者引用或者指针,即必须使该友元函数能够访问到这个类的私有成员变量或者是保护的数据成员或者是私有或保护的成员函数。这样才能体现出友元的特性来。2.友元全局函数的定义和使原创 2016-02-24 11:47:23 · 1560 阅读 · 0 评论 -
c++学习之继承篇(多重继承之虚继承)
虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。形式:在继承定义中包含了virtual关键字的继承关系,如下图中,类A就叫做虚基类。虚拟继承是多重继承中的菱形继承所特有的概念。虚拟基类是为解决多重继承而出现的。菱形继承中既有多继承,如下图所示:菱形继承中也有多重继承原创 2016-01-25 12:09:51 · 3618 阅读 · 0 评论 -
C++学习之继承篇(多继承与多重继承)
1.多继承多继承是指一个子类继承多个父类。多继承对父类的个数没有限制,继承方式可以是公共继承、保护继承和私有继承,不写继承方式,默认是private继承多继承举例:#include #include #include using namespace std;/** * 定义工人类: Worker * 数据成员: m_strName * 成原创 2016-01-21 18:55:41 · 43322 阅读 · 6 评论 -
dynamic_cast
作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 即会作一定的判断。 对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 对引用进行dynamic_cast,失败抛出一个异常,成功返回正常cast后的对象引用。 注原创 2014-06-04 17:38:06 · 622 阅读 · 0 评论 -
#pragma用法大全
示例:#pragma warning(push, 3) // 3 级警告设置入栈 #pragma warning(pop) // 警告设置出栈 #pragma warning(push, 4) // 4 级警告设置入栈 #pragma message("????") // 编译时输出消息 ???? #pragma warning(disable:4001原创 2014-06-05 18:02:33 · 644 阅读 · 0 评论 -
VS2010工程链接的具体过程
一个Debug版的dll链接时,VS会首先链接QT的Debug库,比如QtCoreD.dll,而QtCoreD.dll内部又一定链接了VC的Debug库,比如msvcrD.dll,自己写的dll也会链接VC的Debug库,比如msvcrD.dll.相同的,Release版的都会去链接VC的Release库;在Debug下要把下图中Runtime Library设置成如图所示MDd,原创 2014-12-09 17:29:30 · 1045 阅读 · 0 评论 -
理解inline函数
1.inline函数背后的整体观念是,将“对此函数的每一个调用”都以函数本体替换之。inline在大多数C++程序中是编译期行为,所以inline函数通常一定被置于头文件内,因为在编译过程中进行inlining,讲一个函数调用替换为被调用函数的本体,编译器必须知道那个函数长什么样子。记住,inline只是对编译器的一个申请,不是强制命令。大部分编译器拒绝将太过复杂的(带有循环和递归)的函数inli原创 2015-03-03 12:49:09 · 1150 阅读 · 0 评论 -
C++类静态成员与类静态成员函数
当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关。 静态数据成员的用途之一是统计有多少个对象实际存在。 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝转载 2014-06-04 17:55:25 · 462 阅读 · 0 评论