一.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-----