- 博客(119)
- 资源 (9)
- 收藏
- 关注
原创 构造函数和析构函数的权限问题
在ACIS库中,是不允许构造普通的类对象的,也就是不允许在栈上构建对象。能够实现这一功能,主要是将类的析构函数设置为了保护权限,这样类外对象调用析构函数是非法的,编译就不会通过。在C++中析构函数和构造函数默认是public权限的,但是经常有改变其权限为proteced甚至privated。这篇博客讲的很清楚,https://blog.csdn.net/KingCat666/article/de...
2019-12-24 14:58:49 1026
原创 C++11新特性--using
在下面这篇博客中已经讲的很清楚了,using的三种使用情况。https://blog.csdn.net/shift_wwx/article/details/78742459这里还是要特别说一下,using有typedef的作用,但是更鼓励在C++风格的代码中使用using,在C的代码中使用typedef,我之前一直都是使用的typedef,以后需要多注意。...
2019-12-22 10:50:38 790
原创 CFileDialog使用方法
经常用到这个类,避免每次都去查用法,这里记录一下:用法很简单,通过下面这个例子就很清楚了:CFileDialog openDlg(TRUE, _T("CLS File(*.cls)|*.cls"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("CLS File(*.cls)|*.cls||"),...
2019-12-21 09:48:13 1876 1
原创 MySQL必知必会收货
1.未排序的表中顺序如果插入的数据没有排序,那么数据一般将以它在底层表中出现的顺序显示。这可能是数据最初添加到表中的顺序。但是如果后来数据进行过更新或删除,则这个顺序就会受到MySQL重用回收空间的影响。因此如果没有排序,那么这个顺序是无用的,并且可能是改变的。2.order by子句order by + 列名,列名…作用:是让输出结果按照列的顺序排序输出,注意这个子句的位置,一定放在f...
2019-11-11 10:17:42 188
原创 STL第三章迭代器收货
迭代器相应型别迭代器相应型别:value type 存储的是迭代器所指对象的类型difference type 一般为ptrdiff_t,这是系统定义的int类型数据类型pointer 一般是value type*reference 一般是value type&iterator catagoly 存储的是迭代器的类别因为定义了对应的结构体,所以称之为迭代器型别,个人理解就是...
2019-11-01 17:41:07 205 2
原创 STL sort函数
sort有两种重载形式,一种是依靠自定义的比较函数comp的排序函数,一种是依靠<运算符的排序函数。下面的源码解读选择<运算符的版本。sort函数的流程图如下1 提供给外界的接口sort源码template <class _RandomAccessIter>inline void sort(_RandomAccessIter __first, _RandomAcc...
2019-10-31 21:05:46 466
原创 STL hashtable
SGI版本的STL中的哈希表以及hash_map和hash_set都没有被算入C++标准中的,所以在C++标准中的unorder_map和unorder_set才是最标准化的,其中底层使用的hashtable和我这篇文章中讲的hashtable区别不大,所以在文章的最后,我会对比一下SGI版本的哈希表和当下C++标准中的哈希表的区别一、哈希表概述哈希表同样是一个键值对应一个实值,但是哈希表找到...
2019-10-30 21:56:32 284
原创 STL set和map
这两个容器都是以红黑树为底层机制实现的,set中每个节点只有一个值,也就是把键值作为实值来用,而map中每个节点有两个值,把键值和实值分开一、set特点set底层就是红黑树机制,并且键值就是实值。所有set元素在插入时,就会按照实值(也是键值)自动被排序。,也就是红黑树中每个节点中_M_value_field变量存储的都是单一类型的值。set中不允许两个相同键值存在,因为set插入时使用的...
2019-10-30 19:24:23 265
原创 STL RB tree
一、为什么需要红黑树对于一个有序数列,为了得到对数时间的插入和访问的速度,提出了二叉搜索树,这个树的规则就是任何节点的键值一定大于其左子树中每一个节点的键值,并小于右子树中每一个节点的键值。注意:要和最大堆区别开来,最大堆是父节点一定大于自己的子节点。相当于二叉搜索树是有从左往右变大的趋势,而最大堆则是有从下往上变大的趋势。但是二叉搜索树很有可能产生一种问题,就是不平衡。不平衡没有一个严格的...
2019-10-29 23:01:38 338
原创 STL priority_queue配接器
一、priority_queue介绍priority_queue是一个拥有权值的queue,queue是先来的后出,而priority_queue是权值大的先出,具体可以查看如下的结构图:priority_queue的底层是依靠heap和vector实现的。二、源码展示...
2019-10-28 14:50:43 185
原创 STL heap
注意:heap并不是STL的容器或者配接器,但却是priority queue的底层实现。并且heap运用的是常用的最大堆以及堆排序的方法,所以值得一看一、最大堆和隐式表示法heap的数据结构是一个最大堆,最大堆就是一个完全二叉树,并且每个父节点都大于它的子节点(左右子节点的大小没有限制,不需要大的子节点一定要放哪边)隐式表示法就是一个二叉树,可以用一个数组来表示,如图所示任意一个节...
2019-10-28 14:41:14 268
原创 STL stack和queue适配器
一、配接器和容器的区别适配器是以容器为底层接口封装的,比如stack和queue都是配接器,因为他们都是在deque或者list容器的基础上,进一步封装,形成自己的特性。而deque和list则是完全不依靠其他容器,自己独立实现的。二、stackstack特征:先进后出,并且只有一个出口,并且无法遍历数据结构中的元素。结构类似下图:stack默认是用deque实现的(也可以使用list...
2019-10-28 09:23:46 186
原创 STL deque容器
一、deque概述deque在使用层面上,可以看成是vector的进化版,因为vector在头部插入,其实是将所有元素后移,然后空出一个头部位置插入的。而deque则是直接在头部插入的。所以的确在使用层面可以看成是如下连续的结构。但是在源码层面,deque实现方法要比vector复杂很多,所以书上有这样一段话:注意:其实deque的sort也是使用STL的sort算法,只是deque在移...
2019-10-27 19:52:14 264
原创 STL list容器
一、operator++()和operator++(int)这次认真看了一下list中的重载运算,发现了对operator++()和operator++(int)进行了重载,一时没有搞清楚这两者的区别,其实就是分别重载++前缀和++后缀,正好就以list中迭代器的的源码作为例子,分析一下++前缀和后缀有什么区别 _Self& operator++() { this->_...
2019-10-24 21:43:39 195
原创 MFC中消息机制的具体操作方法
在MFC中,消息机制是非常重要的,无论是点击按钮,光标选择,都是依靠消息机制实现的,那么如果自定义自己的消息机制呢?我所知道的自定义消息机制的方式有两种,先记录下来控件产生的消息如果你想要让控件产生一些默认操作的消息,比如按钮左键按下,产生一个消息,执行按下的回调函数,又比如列表控件下拉时产生对应的消息。总之这些消息产生的原因或者说动作都是MFC已经自定义好的,那么最简单的可以在UI界面直...
2019-10-23 23:38:36 332
原创 STL vector容器
一、vector内部数据结构vector类中的成员变量如下: _Tp* _M_start; //目前使用的空间头部 _Tp* _M_finish; //目前使用的空间尾部 _Tp* _M_end_of_storage; //目前可用空间的尾部创建个vector数组,就是用空间配置器开辟块内存,这时_M_start指向这块空间的头部,_M_end_of_stor...
2019-10-22 14:08:25 217 1
原创 STL第二章空间配置器的收货
一、placement newnew operator就是new操作符,不能被重载,假如A是一个类,那么A * a=new A;实际上执行如下3个过程。调用operator new分配内存,operator new (sizeof(A))调用构造函数生成类对象,A::A()返回相应指针事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了ope...
2019-10-21 16:17:26 207
原创 static和extern用法总结
一、static修饰普通函数在普通函数前加static,表明是局部函数,只是在当前源文件中有用,和局部函数相对的是全局函数(前面加extern就是全局函数,但一般省略),一般函数都是默认声明为全局函数的,并且省略extern。以下面这个例子就可以清除的理解局部函数只在当前源文件中使用的意义了。/*list.h*/#include "iostream"using namespace std...
2019-10-20 14:43:18 1987
原创 形参名不一定需要
有以下这个函数的定义:int add(int a, int b){ return a+a;}如果对这个函数进行声明,一般有以下两种写法:int add(int a, int b);int add(int, int);所以我之前一直以为,函数定义中,入口参数一定要参数名,而声明中可有可无。但其实不是这样,函数定义中的入口参数名也不一定需要(只要这个入口参数在函数...
2019-10-19 12:01:28 707
原创 智能指针源码总结
1.auto_ptrauto_ptr中就只有一个成员变量,就是一个模板指针,在构造函数的初始化列表中初始化这个成员变量,然后在析构函数中删除这个成员变量。但是不能有两个auto_ptr指针同时指向一块内存,这就是auto_ptr最大的缺陷。2.shared_ptrshared_ptr类中的继承关系如图所示①_Ref_count_base是计数器的基类,其中有两个计数器,一个_U...
2019-10-17 16:27:58 644 1
原创 《深度探索C++对象模型》第五章构造、析构、拷贝语意学收货
1.不要把析构函数声明为纯虚函数因为如果这个类被继承了,那么子类在析构时,是会调用父类的析构函数的,而如果纯虚函数被调用,就会终止程序(这个不同编译器不一样)2.指针取地址上的内容和指针指向对应地址的区别在看书过程中看到这样一段代码:本来我以为delete是有问题的,因为我理解成了这样:heap=&local但是这两者是有区别的。书上那样的写法,其实是使...
2019-10-16 10:16:42 185
原创 《深入理解C 对象模型》第六章执行期语意学收货
1.类对象的构造和析构函数调用位置在类对象定义语句之后,随机就调用构造函数但是析构函数在销毁时调用,但是如果类对象是局部对象,并且生命期在一个代码段中,这个代码段中如果有多个离开点,那析构函数就有可能在多个地方调用,比如以下的代码中,析构函数需要在每一个返回点前调用:注意:由此可以得出优化方法,尽可能把类对象定义在使用它的程序区段附近,这么做可能可以节省代码操作。2.全局对象初...
2019-10-14 22:00:00 141
原创 《深度探索C++对象模型》第二章构造函数语意学收获
1.究竟是不是每个类都有构造函数按照C++标准规定,每个类都有显式的或者隐式的构造函数和拷贝构造函数,但是编译器会区分这个类中的构造函数和拷贝构造函数是有用或者无用的,如果判定为有用,编译器就会将这个构造函数生成代码,如果没用,就不会生成代码。(简单来说就是C++规定了每个类都有构造和拷贝构造函数,但是编译器不一定为每个类生成构造或拷贝构造函数,下面的内容都是指编译以后是否是否具有构造函数,所...
2019-10-14 13:48:36 315
原创 《深度探索C++对象模型》第四章 Function语意学收货
目录1.编译器对类普通成员函数的处理2.编译器对静态成员函数的处理3.编译器对虚函数的处理4.虚函数指针和虚函数表5.虚函数继承中的几种情况区分情况一:情况二:情况三:情况四:6.多重继承下的虚函数表布局???但是其中对于打星号的调整this指针的项不是很理解。7.inline关键词理解1.编译器对类普通成员函数的处理我们知道,其实类是编译...
2019-10-11 17:29:42 290
原创 《深度探索C++对象模型》第三章 Data语意学收获
1.虚继承虚继承是建立在多重继承之上的,当多重继承时,有可能存在重复继承的情况,如下图所示在a中,B1,B2虚继承了A,所以当D多重继承了B1和B2时,最后只是间接的继承了一个A类在b中,因为没有使用虚继承,所以最后D间接继承了两个A类,显然这样是不行的。虚继承类并不是存放在类对象空间中的,而是会在类对象空间中存放一个指针,来指向虚继承的存储空间。用此例来探究数据成员的存...
2019-10-10 16:04:48 188
原创 《探索C++深度模型》第一章 关于模型收货
1.类成员分类在C++中,有两种class data members:static 和 nonstatic,以及三种class member functions:static、nonstatic和virtual。2.C++对象的存储结构有一个这样的类class Point{public: Point(float xval); virtual ~Point();...
2019-10-10 14:16:36 150
原创 子类对象代替父类对象作为函数入口参数(以及对类私有成员变量继承的理解)
1.子类对象代替父类对象作为函数入口参数从一个简单的例子中就可以清楚的看出:#include <iostream>using namespace std;class father{public: virtual void show() { cout<<"father value\n"; }};class child : public fa...
2019-10-10 10:28:13 2254 1
原创 RTTI的理解
1.我对RTTI的理解RTTI是一种和虚函数功能类似,但是实现原理不一样的机制。当我们创建一个类对象,并且使用这个对象时,除了知道这个对象中的成员以外,对于类的信息一概不知,比如这个对象所属类的类名,这个对象的继承关系(子类或者父类是什么等等 ),比如:Figure *p; p = new Circle(); Figure &q = *p; 在定义了p这个对象之后,电...
2019-10-09 22:15:48 705
原创 fatal error C1083: 无法打开包括文件: “XXX.h”: No such file or directory问题解决办法
这种错误说明在编译时找不到头文件,首先一种办法就是在项目属性->C/C++->常规->附加包含目录 中添加头文件所在路径,但是我即便添加了也没有作用,最后将附加包含目录中的所有路径全部删除,然后使用电脑的环境变量来描述头文件的路径,结果就没问题了。我个人理解是附加包含目录中头文件路径不能重复,或者比如这个头文件在几个地方都有,不能把这几个地方的头文件路径全部复制进来,混乱或者...
2019-10-08 09:07:26 87209 6
原创 epoll源码总结
1.等待队列等待队列是非常有用的,在epoll中epoll_wait就是睡在等待队列上的,监视文件描述符也是通过等待队列来传递事件消息的,此外进程的阻塞等也是通过等待队列实现的。等待队列具体的操作函数可以参考这篇博客https://www.cnblogs.com/apprentice89/archive/2013/05/09/3068274.html其中等待队列只有两种结构体,一种是队...
2019-10-05 22:05:50 606
原创 muduo源码总结
1.对Reactor模式的理解个人理解Reactor(反应堆)模型,就是用一个线程来监听不止一个文件描述符,每当一个文件描述符产生被关注的事件时,就会分发给其他线程或者自己来解决这个事件。其核心我觉得就是使用epoll实现多路复用,也就是一个线程可以实现多个文件描述符的监听。2.muduo的模式总结muduo的编程模型称之为one loop per thread,我觉得也可以称之为Mu...
2019-09-28 15:29:34 1001
原创 客户端close以后服务端如何知道并执行close
在网络编程中,正常的TCP断开是这样的:但是,四次挥手时当客户端调用close(socket套接字)主动断开以后,只是使用socket函数很难去判断客户端什么时候结束,应该什么时候在服务器去调用close。这里有一下几种方法:1.在muduo中,是客户端使用shutdown(sockfd, SHUT_WR)函数关闭写端连接,这样在服务端的epoll监听队列中,该文件描述符会产生...
2019-09-23 21:10:14 3414
原创 linux中IO函数(仅限于读写)的总结
首先要明白linux中IO函数实现的底层原理:以最常用的read和write为例,来讲解。read从原理上理解就是把对应文件描述符在内核缓存中的值复制到进程空间中write则是把一系列值从进程空间中复制到对应的文件描述符的内核缓冲区中在网上经常有两个概念需要明确:内核缓冲区:这是系统内核自己设置的缓冲区,不管使用什么IO函数,都是存在的,read和write也有内核缓冲区进...
2019-09-23 15:41:32 498
原创 对CLOCK_MONOTONIC的理解
CLOCK_MONOTONIC在timerfd_create以及clock_gettime中都有使用,具体函数如下:int timerfd_create(intclockid, intflags);//创建timerfd描述符//clockid可以填CLOCK_REALTIME,CLOCK_MONOTONIC//flags可以填0,O_CLOEXEC,O_NONBLOCKin...
2019-09-19 09:38:57 28130 4
原创 C++11的智能指针总结
到现在为止遇到了几种智能指针shared_ptr特点:可以自动销毁,并且可以多个指针指向同一块动态内存,内部有一个计数器,等到计数器为零就会自动销毁weak_ptr特点:是shared_ptr指针的附属,weak_ptr指向shared_ptr的区域,但并不会增加shared_ptr的计数器值,而且也不可以直接使用,需要lock(),提升为shared_ptr才可以使用。sco...
2019-09-16 19:54:19 234
原创 字节序的多种转换函数
1.最常用的大小端转换函数uint32_t htonl(uint32_t hostlong);uint16_t htons(uint16_t hostshort);uint32_t ntohl(uint32_t netlong);uint16_t ntohs(uint16_t netshort);h表示host,指小端,n表示network指大端,l表示32位长整数,s表示16...
2019-09-14 10:20:10 3262
原创 linux线程特定函数个人理解
线程特定函数有以下三个int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *));void *pthread_getspecific(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void *value);...
2019-09-09 10:46:41 135
原创 linux中线程的pid,线程的tid和线程pid以及__thread
在linux系统中,每个进程有一个pid(进程ID),获取函数:getpid(),系统内唯一,除了和自己的主线程一样每个线程有一个tid(线程ID),获取函数:pthread_self(),所在进程内唯一,有可能两个进程中都有同样一个tid每个线程有一个pid(不知道叫什么),获取函数:syscall(SYS_gettid),系统内唯一,除了主线程和自己的进程一样,其他子线程都是唯一的...
2019-09-06 19:59:01 4023
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人