C++面试的常见问题(一)

1.C++相比于其他编程语言的特性

精确的内存管理


2.为什么c++的性能高

精确的内存管理


3.为什么c++开发工具和易学易易用性差,开发效率低

C++ 一直与 C 基本保持了向后兼容性,这种兼容性,也一直是 C++ 的安全性和易用性方面的负担。


4.如何实现安全的跨域请求

什么是跨域?
同源策略限制了只有同源的脚本才会被执行,当打开一个网站的时候,会首先检查是否同源,如果非同源,在请求数据的时候,浏览器就会进行拦截报异常,拒绝访问。

如何实现跨域?
1、jsonp

利用了 script 不受同源策略的限制

缺点:只能 get 方式,易受到 XSS攻击

2、CORS(Cross-Origin Resource Sharing),跨域资源共享

当使用XMLHttpRequest发送请求时,如果浏览器发现违反了同源策略就会自动加上一个请求头 origin;

后端在接受到请求后确定响应后会在后端在接受到请求后确定响应后会在 Response Headers 中加入一个属性 Access-Control-Allow-Origin;

浏览器判断响应中的 Access-Control-Allow-Origin 值是否和当前的地址相同,匹配成功后才继续响应处理,否则报错

缺点:忽略 cookie,浏览器版本有一定要求

3、代理跨域请求(Nginx)

前端向发送请求,经过代理,请求需要的服务器资源

缺点:需要额外的代理服务器

4、Html5 postMessage 方法

允许来自不同源的脚本采用异步方式进行有限的通信,可以实现跨文本、多窗口、跨域消息传递

缺点:浏览器版本要求,部分浏览器要配置放开跨域限制

5、修改 document.domain 跨子域

相同主域名下的不同子域名资源,设置 document.domain 为 相同的一级域名

缺点:同一一级域名;相同协议;相同端口

6、基于 HTML5 websocket 协议

websocket 是 Html5 一种新的协议,基于该协议可以做到浏览器与服务器全双工通信,允许跨域请求

缺点:浏览器一定版本要求,服务器需要支持 websocket 协议

7、document.xxx + iframe

通过 iframe 是浏览器非同源标签,加载内容中转,传到当前页面的属性中

缺点:页面的属性值有大小限制


5.c++的标准有哪些

C++11/C++14新特性
一、初始化列表:Initializer lists

二、统一初始化:Uniform initialization

三、类型推理:auto和基于范围的循环:Range-based for loop

3.1 auto

3.2 基于范围的循环:Range-based for loop

四、空指针常量:nullptr和强类型枚举:Strong typed enumerations

4.1 nullptr

4.2 强类型枚举:Strong typed enumerations

五、静态断言:Static assertion和构造函数委托:Constructor delegation

5.1 static_assert

5.2 构造函数委托:Constructor delegation

5.3 拷贝构造函数使用委托:Copy constructor using constructor delegation

六、重写:override和final

6.1 override

6.2 final

七、default和delete

7.1 default

7.2 delete

八、constexpr和string literals

8.1 constexpr

8.2 string literals

九、lambda 函数与表达式:Lambda functions and expressions

9.1 lambda functions

十、std容器: std::array container

10.1 array

10.2 简单介绍array类:simple version of std::array class

https://blog.csdn.net/aaron19890330/article/details/82898306?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-2&spm=1001.2101.3001.4242


6.c++模板编程与泛型编程的区别

【泛型编程】泛型编程让你编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型即是指具有在多种数据类型上皆可操作的含义。(模板是泛型编程的基础)

https://blog.csdn.net/lz201788/article/details/78322641


7.socket API

socket():创建socket

bind():绑定socket到本地地址和端口,通常由服务端调用

listen():TCP专用,开启监听模式

accept():TCP专用,服务器等待客户端连接,一般是阻塞态

connect():TCP专用,客户端主动连接服务器

send():TCP专用,发送数据

recv():TCP专用,接收数据

sendto():UDP专用,发送数据到指定的IP地址和端口

recvfrom():UDP专用,接收数据,返回数据远端的IP地址和端口

closesocket():关闭socket

socket接口详解


8.使用STL的哪些组件?内部如何实现?迭代器失效的可能场景?

C++ STL 的实现:

1.vector 底层数据结构为数组 ,支持快速随机访问

2.list 底层数据结构为双向链表,支持快速增删

3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问
deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下:
[堆1] --> [堆2] -->[堆3] --> …
每个堆保存好几个元素,然后堆和堆之间有指针指向,看起来像是list和vector的结合品.

4.stack 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时

5.queue 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时

(stack和queue其实是适配器,而不叫容器,因为是对容器的再封装)

6.priority_queue 的底层数据结构一般为vector为底层容器,堆heap为处理规则来管理底层容器实现

7.set 底层数据结构为红黑树,有序,不重复

8.multiset 底层数据结构为红黑树,有序,可重复

9.map 底层数据结构为红黑树,有序,不重复

10.multimap 底层数据结构为红黑树,有序,可重复

11.hash_set 底层数据结构为hash表,无序,不重复

12.hash_multiset 底层数据结构为hash表,无序,可重复

13.hash_map 底层数据结构为hash表,无序,不重复

14.hash_multimap 底层数据结构为hash表,无序,可重复

C++STL的容器的底层实现详解

STL各容器迭代器失效的情况分析


9.shared_ptr的线程安全性?循环应用的后果以及如何避免?weak_ptr作用?

shared_ptr的引用计数本身是安全且无锁的。

weak_ptr用于破除循环引用造成的死锁(a引用b,b引用a)。

shared_ptr如何避免循环引用?
shared_ptr是强引用,会计数,weak_ptr是弱引用,不会计数,

为了避免shared_ptr对象相互只有导致循环引用,通常做法是:

owner持有指向child的shared_ptr,child持有指向owner的weak_ptr。

https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21


10.如何实现线程安全的引用计数?如何定制删除动作?

C++ 引用计数(reference count) 实现智能指针


11.常用的设计模式?

12.聊一下代码规范?


13.如何保证代码的可靠性?


猜你喜欢

转载自blog.csdn.net/weixin_43202635/article/details/111940378