1,函数参数传递中值传递、地址传递、引用传递有什么区别?
(1) 值传递,会为形参重新分配内存空间,将实参的值拷贝给形参,形参的值不会影响实参的值,函数调用结束后形参被释放;
(2) 引用传递,不会为形参重新分配内存空间,形参只是实参的别名,形参的改变会影响实参的值,函数调用结束后形参不会被释放;
(3) 地址传递,形参为指针变量,将实参的地址传递给函数,可以在函数中改变实参的值,调用时为形参指针变量分配内存,结束时释放指针变量。
2,C++中explicit关键字有什么作用,什么是类型转换构造函数?
explicit和构造函数一起使用,explicit指明构造函数只能显式使用,目的是为了防止不必要的隐式调用类型转换构造函数。
类型转换构造函数就是自动调用类型匹配的构造函数,自动将基本数据类型转换成对象。
3,智能指针的实现
4,预编译、编译、汇编和链接几个阶段的作用(从源文件到目标文件的过程)
预编译将文本文件中的头文件,宏等进行替换,生成可编译文件
编译是核心阶段,将可编译文件进行词法分析,语法分析,语义分析,代码优化等生成汇编文件
汇编是将汇编文件转换成机器可以执行的指令,生成可重定位目标文件
链接是将可重定位目标文件和所需要的库进行链接,生成可执行文件
5, vector 的底层实现,map、 unordered_map 底层实现,
vector底层实现是数组
map底层实现是红黑树,查询时间复杂是o(logn)
unordered_map底层实现是哈希函数,查询时间复杂度是o(1)
6,动态链接和静态链接
7,进程fork过程(操作系统)
8,预编译保护
9,深拷贝和浅拷贝
深拷贝是指对对象资源重新分配,两个对象的资源内存不同,一个对象的释放不会影响另一个对象。
浅拷贝是指两个对象均指向同一个内存空间,释放一个对象的资源,另一个对象的资源也被释放,造成野指针。
10,hash 函数、hash冲突相关
11,Tcp, Udp区别,Tcp拥塞控制、三次握手、HTTP协议、ARP协议、如何检测发生碰撞、ICMP协议、DNS协议
ARP协议:地址解析协议,根据IP地址解析物理地址
ICMP协议:报文控制协议,只要用于主机和路由器之间传递控制消息。
12,内存对齐规则
13,select, poll, epoll
14,系统中断、中断向量表
15,虚拟内存,程序装载过程
16,使用TCP通信的过程
17,迭代器的实现
18,适配器模式
19,volatile关键字
用来解决变量在“共享”环境下容易出现读取错误的问题。
20,虚函数实现(RTTI)
21,如何限制对象只能在堆上创建
22,如何限制对象只能在栈上创建
23,如何让类不能被继承
已知方法有两种。
一是,将类的构造函数定义为带private属性。
二是,将该类虚继承一个父类,但是该父类的构造函数是带private属性的。
24,如何控制 vector 的内存分配,vector内存管理机制,vector 内存如何释放?
vector是一个动态数组,有一个指针指向一片连续的内存空间,当内存不够的时候会申请一块新的更大的空间,并将数据拷贝过去,当删除数据的时候不会释放空间,只是清空里面的数据。
vector调用析构函数才能释放内存,可以使用swap()函数帮助释放内存。
push_back , pop_back?
25,程序运行的局部性
26,程序装载过程
27,导致程序崩溃的错误有哪些
指针错误,内存泄露,线程死锁,
28,构造函数和析构函数能被继承吗
构造函数和析构函数不能被继承。它们都是每个类都有的东西,如果能被继承,那就没有办法初始化了。
29,C++中Overload、Overwrite及Override的区别
overload是在同一作用域内,函数名相同,返回值和参数不同
override是派生类中覆盖基类中的同名虚函数,
overwrite是指派生类的函数屏蔽了与其同名的基类函数,规则如下:
派生类中的函数与基类中的函数同名,但参数不同,不管有无virtual,基类的函数均被隐藏;
派生类中的函数与基类中的函数同名,且参数但没有virtual关键字,基类的函数将被隐藏。
30,单例,工厂,观察者模式的应用场景
31,虚函数的工作原理
32,什么是野指针,如何检测野指针?
野指针是指向被删除的对象的指针或者指向一段未被申请而访问受限的区域的指针
可以通过
33,什么是内存泄露,怎么检测
内存泄露是指由于设计失误,程序未能释放掉不再使用的内存的情况。内存泄露不是指物理内存上的消失,而是指应用程序分配某段内存后,由于设计失误失去了对该段内存的控制,造成了内存浪费。
用varglind,mtrace检测。
34,TCP粘包怎么处理
35,函数参数什么时候用指针什么时候用引用
数据对象是数组的时候智能用指针,数据对象是类的时候,用引用
36,虚继承和虚函数
虚继承解决的问题是多个父类当中重名冗余的成员(数据成员和函数成员),虚函数解决的是多态的问题。被虚继承的类称为虚基类,含有纯虚函数的类称为抽象基类。
37,进程间的通信方式
1,管道
2,系统IPC:信号量,消息队列,信号,共享内存
3,套接字socket
38,线程间的通信方式
1,互斥量
2,临界区
3,信号量
4,事件
39,线程间的同步方式
1,信号量
2,互斥量
3,条件变量
40,从用户态切换到内核态的3种方式
1,系统调用
2,异常
3,外围设备的中断
41,tcp和udp的区别
1,tcp是面向链接的,udp是面向无连接的
2,tcp是点对点的服务,udp是一对一的,一对多的和多对多的服务
3,tcp是可靠交付,udp是尽最大努力交付,但不保证可靠交付
4,tcp有流量控制和拥塞控制控制,udp没有
5,tcp首部开销大,udp首部开销小
42,tcp和udp 的应用场景
tcp是可靠的,适用于传输大量文件,且可靠性要高的场景
udp是不可靠的,适用于实时性要求高和传输速度快的场景。
43,函数指针和指针函数
44,mac地址和IP地址的差别
mac地址是硬件地址,用来定义网络设备的位置,主要由数据链路层负责
IP地址是由IP协议提供的一种统一的地址格式,为互联网上的每个网络和主机分配一个逻辑地址,来屏蔽物理地址的差异
45,get和post的区别
对于get请求方式,浏览器会将http header和data一并发出去,服务器返回200;
对于POST请求方式,浏览器会先发送header,服务器响应100,浏览器再发送data,浏览器返回200;
1,get参数通过url传递,post通过request body中传递
2,get请求在URL中传递的参数是有长度限制的,而post没有
3,post比get方式安全,因为get的参数直接暴露在URL中,所以不能用来传递敏感信息
4,get只能进行URL编码,而post支持多种编码方式
5,get请求参数会被完整保留在浏览记录里,而post的不会。
46,linux
硬件都在/dev 目录,得把这个设备挂载到目录下(一般为/mnt)(文件系统的临时挂载点),才能对设备上的文件进行读写等操作;