一.C++编程常用技术
1.‘#’include<>常用来包含系统提供的头文件
‘#’include"":先从当前目录进行查找,如果找不到那么就从标准头目录中进行查找
2.形参和实参:
形参只有被调用的时候才分配内存单元,在调用结束的时候立即释放内存单元
3.函数模板
在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同函数的功能
4.引用时一种变量类型,用于为一个变量起一个别名。经过声明之后,两个都代表同一个变量。声明一个引用变量的时候,必须同时初始化。函数执行期间,不可以将其再作为其他变量的引用
5.如果既要提高程序的引用,又要使得传递给函数的数据不在函数中被改变,应该使用引用
6.共用体
- 在一个共用体里面可以定义不同的数据类型,这些数据共享一段内存,在不同的时间里保存不同的数据类型和长度的变量,以达到节省空间的目的。可以使用union来判断系统的大小端。
二.面向对象的C++
1.成员函数
私有的成员函数只能被本类中其他成员函数使用,而不能在类外被调用。成员函数中可以使用类中的任何成员,包括公用的和私有的
2.类的封装性
- 私有成员:只限于类成员访问
- 公有成员:允许类成员和类外的任何访问
- 受保护成员:允许类成员和派生类成员访问,不运行类外的任何访问
3.构造函数
- 构造函数不需要用户调用,而是在建立对象的时候自动执行的
- 在C++中,一个类可以同时定义多个构造函数,以提供不同的初始化方法。这些构造函数的参数个数不同或参数的类型不同,即构造函数的重载
4.析构函数
- 在一个函数中定义了一个对象,当这个函数调用结束的时候,对象会被释放,而且在对象释放之前会自动执行析构函数
- static局部对象只有在main函数结束或者调用exit函数结束程序的时候,才调用static局部对象的析构函数
- 全局对象是在程序离开作用域的时候,才执行析构函数
- 用new建立的对象,用delete释放对象的时候,会调用对象的析构函数
析构函数的目的不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,使得这些内存可以供新的对象使用
5.类的静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象。所有对象的静态数据成员都共享这一块静态存储空间,这就为对象提供了一种互相通信的方法
6.静态成员函数和非静态成员函数的区别为:非静态成员函数有this指针,而静态成员函数没有this指针。
7.纯虚函数:编译器要求在派生类中必须予以重载以实现多态性
8.单例模式:
定义一个单例类,使用类的私有静态指针变量指向类的唯一实例,并用一个公有的静态方法来获取单例
9.封装,继承,多态
三.常用STL的使用
1.字符串
- c_str()返回 一个以'\0'结尾的字符数组
- 需要注意的是:C++字符串并不以'\0'结尾
2.map的三种插入方式
- 用insert函数插入pair数据
- 用insert函数插入value_type数据
- 用数组方式插入数据
3.set
- vector封装了数组,list封装了链表,map和set封装了二叉树
- set为一个关联性容器,红黑树的统计性能要好于一般的平衡二叉树,所以被STL选择作为了关联容器的内部结构
为什么map和set的插入删除效率比其他的要高?
- 对于关联性容器来说,不需要做内存拷贝和内存移动
- set内部所有的元素都是按照节点的方式来存储,节点结构和链表差不多
四.编译
1.步骤:
- 预处理:预处理主要是处理那些源代码文件只能够以'#'开始的预编译指令
- 编译:词法分析,语法分析,语义分析,优化,代码生成
- 链接:将各个模块之间相互引用的部分处理好,使得各个模块之间能够正确的衔接(静态链接[在编译时期完成对库函数的链接]&&动态链接[将对一些库函数的链接载入推迟到程序运行时期])
- 装载
2.ELF的文件类型
- 可重定位的目标文件(.o文件)
- 可执行的目标文件
- 可被共享的目标文件(.so[动态链接库文件])
readelf -h add.o显示add.o的ELF Header的文件头
五.调试
1.top命令:可以实时显示系统中各个进程的资源占用状况
2.ps命令:列出当前在运行的进程的快照
3.Linux程序内存空间布局
- 代码段
- 数据段
- 未初始化数据段
- 堆
- 栈
4.堆栈的区别
- 栈是由系统自动分配;堆需要程序员自己申请,并指明大小(在C语言中使用malloc函数,在C++中使用new)。
- 申请之后系统的相应不同:对于栈,只需要栈的剩余空间大于所申请的空间,系统就为他提供内存,苟泽就报错;堆中首先找记录空闲内存地址的链表
- 栈是向低地址扩展的数据结构,是一块连续的内存的区域。如果申请的空间超过栈的剩余空间,将提示overflow;堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于计算机系统中有效的虚拟内存,因此堆得空间比较灵活,也比较大
- 堆是由系统自动分配,速度较快,但程序员是无法控制的;堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来方便
- 栈快捷但是自由度小,堆比较麻烦,但是自由度大
六.TCP协议
见网络部分整理
七.网络IO模型
1.四种网络IO模型
- 阻塞IO模型:(IO操作需要彻底完成之后才返回到用户空间)
- 非阻塞IO模型:IO操作被调用之后立即返回给用户一个状态值,不需要等到IO操作彻底完成
- 多路IO复用模型:有一个函数(例如select)会不断地轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程(select/epoll的优势并不是对于单个连接能够处理得更快,而是在于能够处理更多的连接)
- 异步IO模型:两方互不等待,互不堵塞
2.
select函数
poll函数:可用于执行多路复用IO
epoll函数:相对于select和poll而言,epoll更加灵活,没有描述符的限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中。
八.网络分析工具
1.常见命令
ping命令
tcpdump命令
netstat命令
lsof命令:列出当前系统打开文件的工具
九.多线程
见Mysql与Java 多线程部分的整理
十.进程
1.进程的创建:
- 由操作系统创建
- 由父进程创建
2.fork()函数
- 对于父进程,fork()函数返回新创建的子进程的ID
- 对于子进程,fork()函数返回0
- 如果创建出错,则fork()函数返回-1
3.exit和return的区别
- exit是一个函数,带有参数,exit执行完之后将控制权交给系统
- return是函数执行完之后的返回,return执行完之后将控制权交给调用函数
4.孤儿进程和僵尸进程
- 孤儿进程是父进程已经退出,而子进程未退出
- 僵尸进程是父进程未退出,而子进程已经退出
5.守护进程
如果不想让某个进程不因为用户或终端或其他的变化而受到影响,就必须把这个进程变为守护进程
十一.进程间通信
1.方式
- 管道
- 消息队列
- 共享内存:一个缺点是没有提供同步的机制
- 信号量
- ipcs命令:用于报告系统的消息队列,信号量,共享内存等
十二.HTTP协议
1.返回码:
- 1xx:指示信息,表示请求已经接收,继续处理
- 2xx:成功,表示请求已经被成功的接收
- 3xx:重定向,要完成请求必须进行更一步的操作
- 4xx:客户端错误,请求有语法错误或请求无法实现
- 5xx:服务器端错误,服务器没有能够实现合法的请求
2.CGI:一个Web服务器提供信息服务的标准接口,通过CGI接口,Web服务器就可以获取客户端提交的信息,转交给服务器端的CGI程序进行处理,最后返回结果给客户端。
十三.常用类库
JSON-----