c++八股3

  1. 多态:在C++中,如果类B继承自A,并且定义了虚函数f(), 类C又继承自B但没有重写f(),那么当你执行如下代码:
Cpp
C *c = new C();
c->f();

调用的将是B类中实现的f()方法,因为C没有提供自己的覆盖版本。若要调用A类(基类)的方法,可以使用显式调用父类的成员函数语法,例如在C类中:

Cpp
class C : public B {
public:
    void f() override {
        B::f(); // 显式调用B类中的f()方法
        // 或者执行C类自己的逻辑
    }
};
  1. 二叉树、平衡二叉树(如AVL树或红黑树)、B+树和红黑树访问一个元素的时间复杂度分析:
    ● 二叉树:最坏情况下(即树退化为链表时),时间复杂度为O(n)。
    ● 平衡二叉树:如AVL树或红黑树,其高度保持在logN级别,所以访问一个元素的时间复杂度为O(logN)。
    ● B+树:在数据库索引等场景常见,通常用于磁盘存储,内部节点不存储数据,所有叶子节点在同一层,因此查找任意键值的时间复杂度也是O(logN)。
    ● 红黑树:一种自平衡二叉查找树,同样保证了查找、插入、删除操作的时间复杂度为O(logN)。
  2. 堆和栈的区别:
    ○ 栈(Stack):由编译器自动分配和释放;空间较小但快速,常用于存储局部变量、函数参数和返回地址等。栈内存分配是连续的、后进先出(LIFO)原则。
    ○ 堆(Heap):由程序员手动申请和释放(通过new和delete关键字);空间较大但分配和回收相对慢,用于动态创建对象和数组等,大小可变。
  3. 注意:在C++中,new关键字是在堆上实例化对象的,而不是栈上。栈上的对象通常是直接声明和初始化的,生命周期与所在作用域相关联。
  4. 四次挥手:这是TCP连接断开的过程,包括FIN(结束)、ACK(确认)、FIN+ACK、ACK四个阶段,确保双方都已知晓连接关闭并释放资源。半连接:通常指的是TCP的“半开连接”,即三次握手过程中服务器收到SYN报文并发送了SYN+ACK回应,但客户端没有回复ACK,此时服务器端会维持一个半连接状态。TCP与UDP区别:
    ○ TCP提供面向连接、可靠传输的服务,有流量控制、拥塞控制和错误校验机制,无消息长度限制,但存在一定的延迟和额外开销。
    ○ UDP则是无连接的,不保证消息的顺序和可靠性,但是传输效率高,适用于实时应用如音视频流传输。UDP的数据包有一个最大长度限制,由MTU(最大传输单元)决定,通常在IP层会有大约65535字节的限制,但实际上由于头部开销,有效负载会更小。
  5. 进程和线程的区别:
    ○ 进程是操作系统资源分配的基本单位,每个进程拥有独立的内存空间、文件描述符集和其他系统资源,互不影响;
    ○ 线程是CPU调度和执行的基本单位,同一进程内的多个线程共享进程的内存空间和全局变量,切换代价小,通信便捷。
  6. 程序从硬盘到CPU执行过程:
    ○ 首先,操作系统加载器将硬盘上的可执行文件读入内存,这个过程包括读取程序的代码段、数据段以及必要的资源;
    ○ 操作系统为该程序创建一个新的进程,并为其分配相应的内存空间;
    ○ 控制权转移到新进程,CPU开始执行程序的第一条指令;
    ○ 程序运行过程中,根据需要创建线程,线程在进程中并发执行,共享进程资源;
    ○ CPU通过分时复用的方式在不同线程间切换,使得多任务能够同时进行。

你可能感兴趣的:(c++)