C++特性:
继承:促进代码共享的重要性(复用),分层组织代码
封装:为对象提供安全的概念
多态:简化代码,易于理解
C++11新特性:
允许构造函数调用其他构造函数,实现构造函数复用
以任何一个构造函数的退出代表构造完成
允许构造函数被继承(通过使用using关键字加类名::构造函数的格式进行调用)
类型转换:一个参数的构造函数可以进行类型转换,而explicit关键字可以防止隐式类型转换
override关键字:使用此关键字修饰的函数在编译期间(而非运行期间)编译器会检查基类中是否有同名函数,若没有将报错
final关键字:防止一个类被继承或一个虚函数被重载
Lamda表达式
常引用相关:
常引用声明方式:const 类型标识符 &引用名 = 目标变量名;
使用常引用后不能通过引用对变量值进行修改,使引用更安全
常引用目的:如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。通过传引用的方式传参时参数应尽量使用const修饰
TCP/UDP区别:
TCP面向连接,可以提供可靠的连接
UDP面向数据,传输速率快,实时性高,但是连接不可靠
TCP三次握手连接过程
1 主机A通过向主机B 发送一个含有同步序列号的标志位的数据段给主机B,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我.
2 主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我
3 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B的数据段:"我已收到回复,我现在要开始传输实际数据了"这样3次握手就完成了,主机A和主机B就可以传输数据了.
3次握手的特点
没有应用层的数据
SYN这个标志位只有在TCP建产连接时才会被置1
握手完成后SYN标志位被置0
TCP四次握手断开过程
1 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求
2 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1
3 由B 端再提出反方向的关闭请求,将FIN置1
4 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束.
五层模型:
七层模型:
加载图片占用内存的计算公式:长*宽*像素/8
const/define区别:
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
(3) 存储方式不同
define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
const常量会在内存中分配(可以是堆中也可以是栈中)。
(4)const 可以节省空间,避免不必要的内存分配。
Cocos2d中的的单例类都有哪些:如Director,AudioEngine等
单例模式优缺点:
优点:提高效率
缺点:单例对象会一直占用内存
Cocos2d中的cache机制:/******待处理******/
C++中const实现机制:编译阶段拒绝所有更改const对象的行为
malloc/free与new/delete的区别
1.malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符
2.new能够自动分配空间大小
3.对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能对对象完成动态内存分配和初始化工作的运算符new,以及一个能对对象完成清理与释放内存工作的运算符delete---简而言之,new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。
C++内存划分:
栈区 :用于存放函数参数及局部变量,由系统进行管理,无需用户参与,默认3M,可调
堆区 :由用户手动申请,手动释放.
全局区/静态区 :用于存放全局和静态变量.
初始化的全局变量和静态变量是在一起的.未初始化存放在相邻的空间中
字符串常量 :用于存放字符串常量,程序结束后,由系统进行释放
代码区 :存放程序体的二进制代码
C++构造析构函数调用顺序
C++构造函数按下列顺序被调用:
(1)任何虚拟基类的构造函数按照它们被继承的顺序构造;
(2)任何非虚拟基类的构造函数按照它们被继承的顺序构造;
(3)任何成员对象的构造函数按照它们声明的顺序调用;
(4)类自己的构造函数。
如:
class Derived :public Base1, virtual public Base2, public Base3, virtual public Base4 //构造顺序与初始化列表中的顺序无关,实际构造顺序为Base2,Base4,Base1,Base3,之后是Derived调用自身构造函数对Derived类对象进行初始化
C++析构函数调用顺序与构造函数调用顺序相反
结构体与联合体:
结构体每一个变量都有独立的内存,所占内存为所有变量所占内存之和
联合体所有变量公用一块内存,大小为最大内存长度