1.讲解一下 cpp 新特性的理解
CPP 的新特性主要是在 C++11 前后的变化,主要包括自动类型推导,lambda 表达式,右值引用和移动语义,智能指针和线程池的引入。
智能指针提供了自动管理堆上空间的方法,可以避免内存泄漏,lambda 可以和算法结合使用,右值引用和移动语义避免了对临时对象的深拷贝,可以适配多种算法。
2.讲解一下函数重载和重写
这是 CPP 实现多态的两种方法,函数重载是静态多态,根据函数参数类型,参数数量,参数顺序,在编译期间匹配具体调用的函数,函数返回值类型不作为区分依据,函数重写是指父类的虚函数在子类中被重写,通过基类指针或者引用绑定子类的对象可以实现不同的效果,叫做动态绑定。
3.什么是 lambda 表达式
lambda 表达式可以当成函数去使用,它的本质是仿函数类,使用=是按值捕获,使用&是引用捕获,其中按值捕获的是创建 lambda 表达式时刻的值。
这里是捕获的哪个值之前真实面试被问到过。
4.懒汉模式和饿汉模式的区别,懒汉模式线程安全如何实现
懒汉模式是当第一次访问指针的时候才创建,饿汉是一开始就创建,懒汉模式可能会遇到线程安全问题比如多个线程同时判断指针为空,都去创建,可以通过两次判断和加锁来解决,不直接使用锁是避免创建成功之后重复申请锁降低并发,先判断是否是空指针,然后申请锁去创建,申请锁之后再判断是否为空指针,如果不是说明已经被创建过了,就释放锁,返回。
5.多线程和多进程的区别是什么,各自的应用场景
进程切换需要切换虚拟地址空间,更新页表,TLB,刷新缓存,会带来更大开销,线程会共享内存,共享文件描述符,私有寄存器和栈,切换开销更小,进程是资源分配的基本单位,线程是调度的基本单位,在 IO 密集型,共享资源的情况下优先使用多线程,在 CPU 密集型的场景优先使用多进程。
复习一下昨天学的八股,感觉 CPP 新特性被问了有三次以上了,然后每次都支支吾吾的不是很确定,函数重载和重写问到的不多,主要是问我多态,问我虚函数,虚函数表虚函数指针这些。