C++面试知识点总结(腾讯TEG过经知识点)
宏定义=直接替换
函数指针:返回类型 (*指针)(参数列表),可以作为形参传递
引用和指针的区别
引用是变量的别名,初始化后不可修改,引用不是一个新的变量,指针则是一个变量,需要内存保留变量的地址
malloc和new的区别
都会从堆分配内存,都需要对应的回收函数free和delete来回收内存。malloc和free函数不会调用对象的构造和析构函数,new和delete则会调用这两个函数,因为他们是运算符而不是标准库函数
堆和栈的区别
数据结构上,堆是树型结构,有大根和小根两种,可以随意存取,栈则是后进先出,不能任意存取从操作系统角度,栈是由操作系统分配和维护的,不需要显式的内存分配机制就可以存取变量,从高地址向低地址生长;堆的内存空间需要程序员向OS申请,从低地址向高地址生长,需要显式的内存回收机制栈是连续的内存区域,堆则是不连续的内存区域,频繁使用会导致内存碎片
const的用法
- 修饰变量:声明变量内容不可更改
- 修饰指针指向的变量:指针指向的变量不可更改
- const char *p1,p1指向的变量不可修改
- char* const p1,p1不可修改
- 不可修饰引用,没有不可修改的引用,但有常量的引用
- 修饰成员函数:函数中不可修改类成员属性
C++ STL 不支持多线程,并发编程存在线程安全问题
多态,重载和重写
多态:分为编译时确定和运行时确定,编译时确定的是函数的重载,即同名函数,不同形参;运行时确定则是基类指针调用虚函数时,会根据指针的对象调用相应的函数重载:同名函数不同形参,编译器通过函数名修饰来实现重写:子类重新定义父类虚函数
引用
- 是变量的别名,不是变量,没有内存空间
- 在声明的同时初始化,不能修改绑定的对象
- 可以作为参数类型,与传指针一样,增加函数间数据通路,在传对象时可以避免调用拷贝函数
- 可连续使用的运算符的返回类型是引用
当类成员包含常量,引用时,使用初始化列表初始化
内存的分配方式
- 从静态存储区分配,如全局变量,静态变量
- 在栈上创建,如局部变量
- 在堆上动态分配
C++源文件到可执行文件:预处理–编译–汇编–链接
多线程的线程间资源共享方式和优势
多线程独享寄存器和栈,共享静态变量,全局变量,堆,文件等资源,线程相对于进程开销小,上下文切换代价小,有方便的通信机制:共享内存,消息传递,有CPU硬件机制支持,超标量,多核;可以改善程序结构,易于代码维护
STL库
- STL库六大类型:Algorithm,Container,Adapter,Function object,iterator,allocator
- 容器序列式容器list:双向链表,有last指向末尾空白节点,插入和删除快,随机访问慢,不需要过多的长距离跳转时较适用,只接受双向迭代器,有内置的sort
- vector会预先分配足够的连续内存,往vector添加元素时,若空间不足,vector会重新申请新的内存空间,将所有元素移入新的内存空间中,插入和删除慢,为O(n)。vector动态数组只会增加内存,不会删除空间,当空间不够时会自动申请另一片更大的空间,然后把原有数据拷贝过去,并删除原来的空间的数据,但是存储空间不会释放,要等到vector调用析构函数的时候才会释放空间。VS2015 下配对源码 每次扩容50%,原来空间大小9,扩容之后9+9/2=13; Ubuntu 下源码是按每次增长两倍算;clear()只会清空数据,不会释放内存
- deque(双向队列):是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。 在中间部分安插元素则比较费时,因为必须移动其它元素。
- 关联式容器set:一对一,自动排序,升序,不允许重复值multiset:一对多,自动排序,升序,允许重复
- map(key,value):一对多,红黑树,不允许重复的key值
*迭代器(iterator) 为所有容器提供一组很小的公共接口,本质是一种智能指针,重载了* -> ++ == != =,分为输入迭代器–只读输出迭代器–只写单向迭代器–双向迭代器
list set multiset map multimap随机访问迭代器
vector deque迭代器失效情况:vector元素被删除后指向后续元素的迭代器失效,关联式容器删除当前节点只会使指向当前节点的迭代器失效 - 算法:sort,swap,search等
- 适配器:在接口与复用环境不一致时,把需要适配的类的接口转换为用户需要的端口,从而实现复用(函数对象)
- 仿函数:重载operator()
- C++allocator类
创建:allocator alloc;
分配:alloc.allocate(n),分配n个用于类型type的空间,这些内存空间是未初始化的回收:alloc.deallocate(T,n) T为指向type的指针,回收从T开始的n块构造:alloc.construct(T,args) 在T指向的内存中构造对象析构:alloc.destory§ p为T*类型的指针,用于对p指向的对象执行析构函数
好处:可以从操作系统预留的堆空间中获取连续内存,避免内存的破碎化,还可以快速分配小对象 - 红黑树:特殊的查找二叉树,根节点值大于等于左节点值,小于等于右节点值
- 红黑树的特性:每个节点或者是红色或者是黑色,根节点是黑色每个空的叶子节点是黑色若一个节点的颜色是红色,则子节点颜色为黑色从一个节点到该结点的子孙节点的所有路径包含相同的黑节点每进行一次插入和删除后会进行一次旋转,使其平衡,新插入的节点染红色相较于一般的二叉树,对空间利用更好