C++ 方向面试考点总结(持续更新中)

本文深入探讨了C++与C的区别,解释了死锁现象及其预防措施,阐述了线程、进程与协程之间的差异,介绍了进程间通信方式,并讨论了线程间的通信方法。此外,还涉及了C++内存分配机制、数据库索引的利弊、常见排序算法的时间复杂度分析等计算机科学领域的关键主题。

 

目录

 

1 C++ 和 C的区别?

 

2 解释一下死锁,谈一下如何避免?

3 线程、进程与协程的区别?

 

4进程间有哪些通讯方式?

 

5线程之间通讯方式?

 

6  C++ 内存分配

 

7 C++中 <<   >>   和 “  ”  引用文件有什么区别 ?

8数据库索引的好处和坏处?

 

9 各种排序算法的时间复杂度性能分析

 

1 归并排序

 

2  冒泡排序

 

 

3  选择排序

 

 

4 快速排序

 

10 指针与引用的区别

 

 

11 new/delete 和malloc/free 的区别

 

12 三次握手和四次挥手

 

 

13 TCP/IP 模型 ,5层模型,7层模型

 

 

14 TCP /UDP 区别

 

 

15 一个文件的编译和链接过程

 

16 举例HTTP在百度网址上解析内容的过程

17 Socket 编程在客户端和服务器端的函数使用

 

18 数据库的四大特性

 

19 数据库的三大范式​

20 单例模式下使用情景​

 

21  MQSQL 优化方法

22   MYSQL  和  Redis 区别  ​

23   RDD 数据结构

 

24  函数重载

25 构造函数和析构函数,哪个可以作为虚函数?

26  内存泄露与内存溢出的区别,以及检测工具

27  不能重载的运算符有哪些?

28  使用erase 删除容器中需要被删除的数据

29   简单工厂模式

30 工厂方法模式

31  抽象工厂模式

32  多线程的锁机制

33 C++ 的智能指针 

 

34 如何解决哈希冲突

35  迭代器失效问题

36  B+ 树

37  覆盖、重载、多态

38    map  、 set   、   红黑树的底层原理

39 (粘包 ,连包)如何保证数据的完整不出错

40  https 如何防止网站被攻击,访问错误网站

41   FIFO  、 LRU   、LFU 

42   红黑树

43  出栈顺序不可能的是

44  输入多行字符串

45 select 、epoll 、 poll 

 

46  strcpy  和  memcpy   ​​

47  C++ 11 新特性

 

48 腾讯C++面试面经及答案(转载自  https://zhuanlan.zhihu.com/p/274473971?utm_source=wechat_session&utm_medium=social&utm_oi=758706130871418880 )




1 C++ 和 C的区别?

  1.  C++ 面向对象   C 面向过程
  2.  C++ 有封装、继承、多态特性   C没有 
  3.  C++  有许多支持安全的功能,如强制类型转换,static_cast<int>,C虽然也能强制类型转换,但是不保证结果准确
  4.  C++ 支持泛型编程,如模板库和函数模板等 ,C没有

 

2 解释一下死锁,谈一下如何避免?

死锁产生的4个必要条件:

  1. 互斥条件:   一个资源一次只能被一个进程所访问,即一段时间内,某资源只能被被一个进程所拥有,其他资源想要访问时,只能等待。
  2. 请求与保持条件:进程已经申请并拥有了一个资源,这时又申请其他新的资源时,该资源被其他进程所占有,此时请求进程被阻塞,但自己已经获得的资源不会释放。
  3. 不可剥夺条件:当前进程获得的资源在未使用完毕之前,是不能被其他进程强行夺走,只能由获得该资源的进程自己主动释放。
  4. 循环等待条件:若干进程之间形成首尾相接的循环等待资源关系。

 

打破死锁的必要条件

打破 请求与保持条件: 进程一开始就静态分配每个进程所需要的全部资源,或者 动态分配,即每个进程在申请所需要的新资源时主动先释放自己已经占有的资源。

打破 不可剥夺条件:一个进程不能获得所需要的全部资源时就要处于等待状态,等待期间所占有的资源就要被隐式的释放到系统资源列表中,方便被其他进程所使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源,才可以重新启动。

打破 循环等待条件:采用资源有序分配的思想,即将系统中的资源标号,将紧缺的,稀少的资源采用较大的编号,在申请资源时,必须按照编号的顺序进行,一个进程必须按照从小到大的顺序申请资源。

 

 

3 线程、进程与协程的区别?

 

进程       直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源),进程是资源分配的最小单位

线程        有时被称为轻量级进程(Lightweight Process,LWP),是操作系统调度(CPU调度)执行的最小单位

【区别】:

  • 调度线程作为调度和分配的基本单位,进程作为拥有资源的基本单位

  • 并发性不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行

  • 拥有资源进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。进程所维护的是程序所包含的资源(静态资源), 如:地址空间,打开的文件句柄集,文件系统状态,信号处理handler等;线程所维护的运行相关的资源(动态资源),如:运行栈,调度相关的控制信息,待处理的信号集等

  • 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。但是进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个进程死掉就等于所有的线程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些进程的创建、切换、和销毁开销都很大

  • 一个进程崩溃,其他进程不受影响,一个线程崩溃,进程内的其他线程会都崩溃

  • 通讯 :进程之间通讯复杂,线程之间由于代码段和数据段共享,所以通讯简单。

协程   是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。

  协程在子程序内部是可中断的,然后转而执行别的子程序,在适当的时候再返回来接着执行

  子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。

  

 

(转:https://blog.csdn.net/daaikuaichuan/article/details/82951084

 

 

4进程间有哪些通讯方式?

不同主机之间: socket 

同一个主机之间 : 

  1. 管道: PINE  , FIFO 
  2. 系统IPC:消息队列,信号,信号量,共享内存

 

5线程之间通讯方式?

临界区,互斥量,信号量,事件(信号)

 

6  C++ 内存分配

 

 

 

7 C++中 <<   >>   和 “  ”  引用文件有什么区别 ?

 

8数据库索引的好处和坏处?

 

 

9 各种排序算法的时间复杂度性能分析

 

 

1 归并排序

void merge(int arr[], int l, int m, int r) 
{ 
    int i, j, k; 
    int n1 = m - l + 1; 
    int n2 =  r - m; 
 
    int L[n1], R[n2]; 
 
    for (i = 0; i < n1; i++) 
        L[i] = arr[l + i]; 
    for (j = 0; j < n2; j++) 
        R[j] = arr[m + 1+ j]; 
 
    i = 0; 
    j = 0; 
    k = l; 
    while (i < n1 && j < n2) 
    { 
        if (L[i] <= R[j]) 
        { 
            arr[k] = L[i]; 
            i++; 
        } 
        else
        { 
            arr[k] = R[j]; 
            j++; 
        } 
        k++; 
    } 
  
    while (i < n1) 
    { 
        arr[k] = L[i]; 
        i++; 
        k++; 
    } 
  
    while (j < n2) 
    { 
        arr[k] = R[j]; 
        j++; 
        k++; 
    } 
} 
  
void mergeSort(int arr[], int l, int r) 
{ 
    if (l < r) 
    { 
        int m = l+(r-l)/2; 
  
        mergeSort(arr, l, m); 
        mergeSort(arr, m+1, r); 
  
        merge(arr, l, m, r); 
    } 
}

 

2  冒泡排序

void bubbleSort(vector<int>& a)
{
      bool swapp = true;
      while(swapp){
        swapp = false;
        for (size_t i = 0; i < a.size()-1; i++) {
            if (a[i]>a[i+1] ){
                swap(a[i],a[i+1]);
                                /*a[i] += a[i+1];
                                a[i+1] = a[i] - a[i+1];
                                a[i] -=a[i+1];
                                */
                swapp = true;
            }
        }
    }
}

 

 

3  选择排序

void selectionSort(vector<int>& arr) {
    int len = arr.size();
    int minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {     // 寻找最小的数
                minIndex = j;                 // 将最小数的索引保存
            }
        }
        swap(arr[i], arr[minIndex]);
    }
    return;
}

 

 

4 快速排序

#include<iostream>
using namespace std;
void quickSort(int a[], int m,int n);
int partion(int a[], int m, int n);
int main()
{
	int a[] = { 6,1,2,7,9,3,4,5,10,8 };
	int m = 0;
	int n = (sizeof(a) / 4)-1;
	quickSort(a, m,n);
	for (int i = 0; i < 10; i++)
	{
		cout << a[i] << " ";
	}
}
void quickSort(int a[], int l, int r)
{
	if (l < r)
	{
		int q = partion(a, l, r);
		quickSort(a, l, q - 1 );
		quickSort(a, q + 1, r);
	}
}
int partion(int a[], int begin, int end)
{
	int stone = a[begin];
	while (begin < end)
	{
		while (begin < end && a[end] > stone)
		{
			end--;
		}
		swap(a[begin], a[end]);
		while (begin < end && a[begin] <= stone)
		{
			begin++;
		}
		swap(a[begin], a[end]);
	}
	return begin;
}

 

 

10 指针与引用的区别

 

 

11 new/delete 和malloc/free 的区别

 

 

12 三次握手和四次挥手

 

 

 

 

13 TCP/IP 模型 ,5层模型,7层模型

(转自   https://www.cnblogs.com/qishui/p/5428938.html

     OSI 7层模型

  TCP/IP 5层模型

 

 

14 TCP /UDP 区别

 

 

15 一个文件的编译和链接过程

 

16 举例HTTP在百度网址上解析内容的过程

17 Socket 编程在客户端和服务器端的函数使用

 

18 数据库的四大特性

 

19 数据库的三大范式

20 单例模式下使用情景

 

21  MQSQL 优化方法

 

 

 

22   MYSQL  和  Redis 区别  

 

23   RDD 数据结构

 

24  函数重载

 

25 构造函数和析构函数,哪个可以作为虚函数?

26  内存泄露与内存溢出的区别,以及检测工具

27  不能重载的运算符有哪些?

28  使用erase 删除容器中需要被删除的数据

29   简单工厂模式

 

30 工厂方法模式

 

31  抽象工厂模式

32  多线程的锁机制

 

33 C++ 的智能指针 

 

34 如何解决哈希冲突

35  迭代器失效问题

36  B+ 树

37  覆盖、重载、多态

38    map  、 set   、   红黑树的底层原理

39 (粘包 ,连包)如何保证数据的完整不出错

40  https 如何防止网站被攻击,访问错误网站

41   FIFO  、 LRU   、LFU 

42   红黑树

43  出栈顺序不可能的是

44  输入多行字符串

45 select 、epoll 、 poll 

(转自      https://www.cnblogs.com/aspirant/p/9166944.html

 

 

46  strcpy  和  memcpy   

47  C++ 11 新特性

 

 

48 腾讯C++面试面经及答案(转载自  https://zhuanlan.zhihu.com/p/274473971?utm_source=wechat_session&utm_medium=social&utm_oi=758706130871418880 )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值