C++面试知识点总结(1)

(1)C++11新特性

1.nullptr

nullptr 出现的目的是为了替代 NULL。

在某种意义上来说,传统 C++ 会把 NULL、0 视为同一种东西,这取决于编译器如何定义 NULL,有些编译器会将 NULL 定义为 ((void*)0),有些则会直接将其定义为 0。

C++ 不允许直接将 void * 隐式转换到其他类型,但如果 NULL 被定义为 ((void*)0),那么当编译char *ch = NULL;时,NULL 只好被定义为 0。而这依然会产生问题,将导致了 C++ 中重载特性会发生混乱。

为了解决这个问题,C++11 引入了 nullptr 关键字,专门用来区分空指针、0。nullptr 的类型为 nullptr_t,能够隐式的转换为任何指针或成员指针的类型,也能和他们进行相等或者不等的比较。当需要使用 NULL 时候,直接使用 nullptr。

2. 类型推导auto/decltype

C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导,让编译器来判断变量的类型。

auto str1="aaaaa";//str1的类型是const char*
auto str2="aaaaa"s;//str2的类型是string

拖尾返回类型、auto 与 decltype 配合(C++11):

template<typename T, typename U>
auto add(T x, U y) -> decltype(x+y) {
    return x+y;
}

从 C++14 开始是可以直接让普通函数具备返回值推导:

template<typename T, typename U>
auto add(T x, U y) {
    return x+y;
}

3. 区间迭代

std::vector<int> arr(5, 100);
for(std::vector<int>::iterator i = arr.begin(); i != arr.end(); ++i) {
    std::cout << *i << std::endl;
}

变成:

// & 启用了引用
for(auto &i : arr) {    
    std::cout << i << std::endl;
}

4. 更多:https://blog.csdn.net/jiange_zh/article/details/79356417

(2)C++中判断数据的类型

1. typeid

typeid(str)==typeid(int/const char*/string...)`

2. cin

int a;
cin>>a;
if(cin.good()){}else{} 

如果出错了还要重新输入的话,需要用到cin.clear()函数来将错误位清除。

(3)C++里面虚函数是怎么实现的?

通过虚函数表和虚函数指针实现,每个对象有一个虚函数表指针,每个类有一个虚函数表。虚函数表指针大小为4字节,存储在对象的起始地址。虚函数表中存储的是对应类的所有虚函数。

(4)怎么获取虚函数地址

如果一个类中存在虚函数的话,那么编译器就会为这个类生成一个虚函数表,这个虚函数表中按照个虚函数的声明顺序存放了各个虚函数的地址,需要注意的是,这个虚函数表并不存在于类中,而对于这个类的每个对象,编译器都会为其生成一个透明不可见的指针,这个指针就是虚函数表指针,位于该对象内存中的开头,并指向了虚函数表的位置。换句话说,如果一个类中存在虚函数,假设声明一个对象a,在32位的编译情况下,对象a的内存布局中前4个字节中就存放了虚函数表的地址。因此,通过这前4个字节就可以找到虚函数表,而在虚函数表中,按照虚函数的声明顺序存放了各个虚函数地址。

(5)64位系统存一个地址多大空间

内存地址是16进制保存的,一个内存(内存空间)是一个字节(8bit):
16位操作系统的内存地址占用大小是16位,即2字节
32位操作系统的内存地址占用大小是32位,即4字节
64位操作系统的内存地址占用大小是64位,即8字节
128位操作系统的内存地址占用大小是128位,即16字节

(6)访问百度网站的流程是什么?

1.DNS解析

浏览器首先搜索浏览器自身缓存的DNS记录;如果浏览器缓存中没有找到需要的记录或记录已经过期,则搜索hosts文件;如果在hosts文件中没有找到需要的记录或记录已经过期,则向域名解析服务器发送解析请求;如果域名解析服务器也没有该域名的记录,则开始递归+迭代解析。
(首先我们的域名解析服务器会向根域服务器发出请求,接着,根域服务器会告诉我们com域服务器的IP,接着我们的域名解析服务器会向com域服务器发出请求。根域服务器并没有www.baidu.com的IP,但是却有baidu.com域服务器的IP。我们的域名解析服务器会向baidu.com域服务器发出请求。如此重复,直到获得www.baidu.com的IP地址。)

2.发起TCP请求

浏览器会选择一个大于1024的本机端口向目标IP地址的80端口发起TCP连接请求。经过标准的TCP握手流程,建立TCP连接。

3.发起HTTP请求

在建立起的TCP连接中,按照HTTP协议标准发送一个索要网页的请求。

4.负载均衡

(1)什么是负载均衡?当一台服务器无法支持大量的用户访问时,将用户分摊到两个或多个服务器上的方法叫负载均衡。
(2)负载均衡的方法很多,Nginx负载均衡、LVS-NAT、LVS-DR等。这里,我们以简单的Nginx负载均衡为例。
(3)什么是Nginx?Nginx是一款面向性能设计的HTTP服务器,相较于Apache、lighttpd具有占有内存少,稳定性高等优势。Nginx有4种类型的模块:core、handlers、filters、load-balancers。我们这里讨论其中的2种,分别是负责负载均衡的模块load-balancers和负责执行一系列过滤操作的filters模块。

(如果我们的平台配备了负载均衡的话,前一步DNS解析获得的IP地址应该是我们Nginx负载均衡服务器的IP地址。所以,我们的浏览器将我们的网页请求发送到了Nginx负载均衡服务器上。Nginx根据我们设定的分配算法和规则,选择一台后端的真实Web服务器,与之建立TCP连接、并转发我们浏览器发出去的网页请求。Web服务器收到请求,产生响应,并将网页发送给Nginx负载均衡服务器。Nginx负载均衡服务器将网页传递给filters链处理,之后发回给我们的浏览器。)

5.浏览器渲染

(1)浏览器根据页面内容,生成DOM Tree。根据CSS内容,生成CSS Rule Tree(规则树)。调用JS执行引擎执行JS代码。
(2)根据DOM Tree和CSS Rule Tree生成Render Tree(呈现树)。
(3)根据Render Tree渲染网页。
在浏览器解析页面内容的时候,发现页面引用了其他未加载的image、css文件、js文件等静态内容,因此有了第6个步骤。

6.网页静态资源加载

接下来的流程就是浏览器根据url加载该url下的图片内容。本质上是浏览器重新开始第一部分的流程,区别只是负责均衡服务器后端的服务器不再是应用服务器,而是提供静态资源的服务器。

(7)怎么判断链表相交?怎么判断链表有环?怎么找到环入口地址?为什么这么找?怎么证明?

判断链表相交

  1. 判断两个链表的尾结点是否为同一个结点,只要两链表的最后一个结点是同一个结点,那么链表必定相交。
  2. 首先分别获取两个链表的长度lenListA与lenListB,然后先让较长的链表走N步,N=(lenListA-lenListB)的绝对值。然后两个链表再同时走,直到两个链表的结点是一样的,此时这个结点就是两个链表相交的起始节点

判断链表有环(快慢指针

  1. 首先创建两个指针1和2,同时指向这个链表的头节点。
  2. 开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断出链表有环,如果不同,则继续下一次循环。

环入口地址

我们先假设链表长度为N,环长度为n,那么我们就可以直接计算出快慢指针的相遇节点

1.当n>=N/2时,快慢指针相遇的第n个节点。可推理出此时慢指针必然在环内。

慢指针走了n步时,快指针走了2n步,比慢指针多走了n步,正好绕环一周回到 n节点,故此时相遇。

2.当n<N/2时,快慢指针相遇在 第(N-N%n)个节点。

由于 N%n<n,故此时慢指针已在环内,快指针比慢指针多走了(N-N%n)步,而(N-N%n)必然是 n的倍数,故 快指针 只比慢指针多绕环走了几整圈而已,此时快慢指针相遇。

(8)怎么判断两个有环链表是否相交?

如果两个带有环的链表相交,则这两个链表的环肯定是同一个环。

先判断两个链表是否有环,如果有环的话,找到环的入口点。让链表1从环入口点loop1出发,因为loop1和之后节点都在环上,所以将来一定能回到loop1。如果回到loop1之前并没有遇到链表2的环入口点loop2,那么两个有环链表不相交,返回null,否则相交。

(9)unordered_map 与 map 的区别

1.头文件 unordered_map>;  map>
2.unordered_map 内部实现:哈希表;map 内部实现:红黑树
3.unordered_map 查找效率:非常高;map 则需要挨个遍历查找,效率低下
4.unordered_map 是否有序:无序;map 内部实现了红黑树,故map存入元素时会自动排序,且默认升序

猜你喜欢

转载自blog.csdn.net/qq_46140765/article/details/129666900