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

1.TCP三次握手四次挥手的原因

为什么要进行三次握手呢(两次确认)?

建立三次握手主要是因为A发送了再一次的确认,那么A为什么会再确认一次呢,主要是为了防止已失效的连接请求报文段又突然传送给B,从而产生了错误。

所谓“已失效的连接请求报文”是这样产生的,正常情况下,A发出连接请求,但是因为连接报文请求丢失而未收到确认,于是A再重传一次连接请求,后来收到了请求,并收到了确认,建立了连接,数据传输完毕后,就释放链接,A共发送了两次连接请求报文段,其中第一个丢失,第二个到达了B,没有“已失效的连接请求报文段”,但是还有异常情况下,A发送的请求报文连接段并没有丢失,而是在某个网络节点滞留较长时间,以致延误到请求释放后的某个时间到达B,本来是一个早已失效的报文段,但是B收到了此失效连接请求报文段后,就误以为A又重新发送的连接请求报文段,并发送确认报文段给A,同意建立连接,如果没有三次握手,那么B发送确认后,连接就建立了,而此时A没有发送建立连接的请求报文段,于是不理会B的确认,也不会给B发送数据,而B却一直等待A发送数据,因此B的许多资源就浪费了,采用三次握手的方式就可以防止这种事情发生,例如刚刚,A不理会B,就不会给B发送确认,B收不到A的确认,就知道A不要求建立连接,就不会白白浪费资源。

为什么要进行四次挥手呢?

由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当一方完成数据发送任务后,发送一个FIN来终止这一方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是在这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。

在建立连接时,当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是在断开连接时,当Server端收到FIN报文时,很可能并不会立即想关闭连接,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

四次挥手的过程如下所述:

  1. 数据传输结束后,客户端的应用进程发出连接释放报文段,并停止发送数据,客户端进入FIN_WAIT_1状态,此时客户端依然可以接收服务器发送来的数据。

  2. 服务器接收到FIN后,发送一个ACK给客户端,确认序号为收到的序号+1,服务器进入CLOSE_WAIT状态。客户端收到后进入FIN_WAIT_2状态。

  3. 当服务器没有数据要发送时,服务器发送一个FIN报文,此时服务器进入LAST_ACK状态,等待客户端的确认。

  4. 客户端收到服务器的FIN报文后,给服务器发送一个ACK报文,确认序列号为收到的序号+1。此时客户端进入TIME_WAIT状态,等待2MSL(MSL:报文段最大生存时间),然后关闭连接。


2.父类和子类构造函数析构函数调用顺序

定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数

析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数


3.cookie和session区别

Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

简单的说,当你登录一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上面,

客户端每次请求服务器的时候会发送 当前会话的session_id,服务器根据当前session_id判断相应的用户数据标志,以确定用户是否登录,或具有某种权限。

由于数据是存储在服务器 上面,所以你不能伪造,但是如果你能够获取某个登录用户的session_id,用特殊的浏览器伪造该用户的请求也是能够成功的。

session_id是服务器和客户端链接时候随机分配的,一般来说是不会有重复,但如果有大量的并发请求,也不是没有重复的可能性。

Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID 为标识符来存取服务器端的Session存储空间。而SessionID这一数据则是保存到客户端,用Cookie保存的,用户提交页面时,会将这一 SessionID提交到服务器端,来存取Session数据。这一过程,是不用开发人员干预的。所以一旦客户端禁用Cookie,那么Session也会失效。

2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗考虑到安全应当使用session。

3、设置cookie时间可以使cookie过期。但是使用session-destory(),我们将会销毁会话。

4、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie。

5、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。(Session对象没有对存储的数据量的限制,其中可以保存更为复杂的数据类型)

注意:

  session很容易失效,用户体验很差;

  虽然cookie不安全,但是可以加密 ;

  cookie也分为永久和暂时存在的;

  浏览器 有禁止cookie功能 ,但一般用户都不会设置;

 一定要设置失效时间,要不然浏览器关闭就消失了;



  例如:

        记住密码功能就是使用永久cookie写在客户端电脑,下次登录时,自动将cookie信息附加发送给服务端。

        application是全局性信息,是所有用户共享的信息,如可以记录有多少用户现在登录过本网站,并把该信息展示个所有用户。

两者最大的区别在于生存周期,一个是IE启动到IE关闭.(浏览器页面一关 ,session就消失了),一个是预先设置的生存周期,或永久的保存于本地的文件。(cookie)

Session信息是存放在server端,但session id是存放在client cookie的,当然php的session存放方法是多样化的,这样就算禁用cookie一样可以跟踪

Cookie是完全保持在客户端的如:IE firefox 当客户端禁止cookie时将不能再使用


4.介绍下flask

Flask是一个使用 Python 编写的轻量级 Web 应用框架。

Flask的socket是基于Werkzeug 实现的,模板语言依赖jinja2模板


5.介绍下gin

Gin 是一个 Go 写的 web 框架,具有高性能的优点。

Gin 是 Go语言写的一个 web 框架,它具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件和 json。


6.Redis能存储的数据类型

  1. 字符串string
  2. 列表list
  3. 散列hash
  4. 集合set
  5. 有序集合sorted set

https://blog.csdn.net/weixin_33947521/article/details/93823167?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control


7.Redis常用命令

Redis 常用命令
登录 redis-cli -p 5566 -a password
检查key是否存在 EXISTS key
搜索某关键字 KSYS *4
返回一个Key所影响的vsl的类型 TYPE key

1 String
设置一个键的值 SET key value
获取一个建的值 GET key
删除键对 DEL key
同时获取多个 mget key1 key2

2 Hash
设置一个hash HMSET key valueKey value --<key,<valueKey,value>>
获取hash所有key&value HGETALL key
获取hash所有key HKEYS key
获取hash所有key的vslue HVALS key
获取hash内键值对的长度 HLEN key
给一个hash的某个键值对赋值 HSET key valueKey value
当hash中valueKey不存在时赋值 HSETNX key valueKey value

3 List
给list赋值 LPUSH listName value
按照索引取值 LINDEX listName 1


8.c++模板编程

template <模板形参表>
函数返回类型 函数(形参表){
      函数体;
};

例如:

template <typename T> 
inline const T& Max(const T& a, const T& b){
        return a>b?a:b;
}

Max(2,10);

9.中序遍历递归,非递归

递归:

void dfs(TreeNode* root, vector<int> &data){
	if(!root)
		return;
	
	dfs(root->left,data);
	data.emplace_back(root->val);
	dfs(root->right,data);
}

非递归:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode head) {
        List<Integer> list=new ArrayList<Integer>();
        Stack<TreeNode> stack=new Stack<TreeNode>();
        if (head!=null) {
            while(head!=null||!stack.empty()) {
                if(head!=null) {
                    stack.push(head);
                    head=head.left;
                }else {
                    head=stack.pop();
                    list.add(head.val);
                    head=head.right;
                }
            }
        }
        return list;
    }
}

10.两数之和

vector<int> twoSum(vector<int>& numbers, int target) {
        unordered_map<int,int> mp;
        for(int i=0;i<numbers.size();i++){
            if(mp.count(target-numbers[i])){
                return {mp[target-numbers[i]],i+1};
            }else{
                mp[numbers[i]]=i+1;
            }
        }
        return {};
    }

11.实现strcat,strcpy

实现strcat:把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)

char* myStrcat(char* pre, const char* next)
{
    if (pre == nullptr || next == nullptr) // 如果有一个为空指针,直接返回pre
        return pre;
    char* tmp_ptr = pre + strlen(pre); //strlen计算字符数,需要包含都文件string.h,当然也可以自己实现

    while ( (*tmp_ptr++ = *next++) != '\0'); // 依次接着赋值

    return pre;
}

实现strcpy:复制字符串

char* myStrcpy(char* pre, const char* next)
{
    if (pre == nullptr || next == nullptr) //空指针直接返回
    {
        return nullptr;
    }
    if (pre == next)                       // 两者相等也无需拷贝了
        return pre;

    while ((*pre++ = *next++) != '\0');    // 依次赋值给主字符数组

    return pre;
}

12.手写非重复最长公共子序列

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        map<char, int> mp;
        int res=0,max_res=0;

        for(int i=0;i<s.length();i++){
            int last_pos=mp.count(s[i])?mp[s[i]]:-1;
            mp[s[i]]=i;
            if(res>=i-last_pos)
                res=i-last_pos;
            else
                res+=1;
            max_res=max(max_res,res);
        }

        return max_res;
    }
};

13.C++什么时候只能用指针?什么时候只能用引用?

何时使用引用参数

  1. 程序员能够修改调用函数中的数据对象。
  2. 通过传递引用而不是整个数据对象,可以提高程序的运行速度。

在这里插入图片描述


14.const成员函数的作用?

程序通常不直接修改类对象。在必须修改类的对象时,应调用公有成员函数集来完成。为尊重类对象的常量性,编译器必须区分不安全与安全的成员函数(即区分试图修改类对象与不试图修改类对象的函数)

类的设计者通过把成员函数声明为const,以表明它们不修改类对象。例如:

    class Screen {
    public:
        char get() const {return _screen[_cursor];}
        //...
    };

只有被声明为const的成员函数才能被一个const类对象调用。关键字const被放在成员函数的参数表和函数体之间。对于在类体之外定义的const成员函数,我们必须在它的定义和声明中同时指定关键字const。

注意,把一个修改类数据成员的函数声明为const是非法的。


15.为什么要提出右值引用?

右值引用允许从程序中其他地方无法引用的临时对象转移资源


16.对象指针如何找到对应的虚函数表?

类:有虚函数,这个类会产生一个虚函数表。
类对象:有一个指针,指针(vptr)会指向这个虚函数表的开始地址。类对象的虚函数表指针位置取决于编译器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、什么是兼容性测试?兼容性测试侧重哪些方面? 5 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 5 3、测试的策略有哪些? 5 4、正交表测试用例设计方法的特点是什么? 5 5、描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程? 5 6、你觉得bugzilla在使用的过程中,有什么问题? 5 7、描述测试用例设计的完整过程? 6 8、单元测试的策略有哪些? 6 9、LoadRunner分哪三部分? 6 10、LoadRunner进行测试的流程? 6 什么是并发?在lordrunner中,如何进行并发的测试?集合点失败了会怎么样? 6 12、使用QTP做功能测试,录制脚本的时候,要验证多个用户的登录情况/查询情况,如何操作? 6 13、QTP中的Action有什么作用?有几种? 6 14、TestDirector有些什么功能,如何对软件测试过程进行管理? 7 15、你所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……)? 7 16、条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录? 8 17、Beta测试与Alpha测试有什么区别? 8 18、软件的评审一般由哪些人参加?其目的是什么? 8 19、测试活动中,如果发现需求文档不完善或者不准确,怎么处理? 8 20、阶段评审与项目评审有什么区别? 8 21、阐述工作版本的定义? 8 22、什么是桩模块?什么是驱动模块? 8 23、什么是扇入?什么是扇出? 8 24、你认为做好测试计划工作的关键是什么? 8 25、你认为做好测试用例工作的关键是什么? 9 26、简述一下缺陷的生命周期? 9 27、软件的安全性应从哪几个方面去测试? 9 28、软件配置管理工作开展的情况和认识? 9 29、你觉得软件测试通过的标准应该是什么样的? 10 30、引入测试管理的含义? 10 31、一套完整的测试应该由哪些阶段组成? 10 32、单元测试的主要内容? 10 33、集成测试也叫组装测试或者联合测试,请简述集成测试的主要内容? 10 34、简述集成测试与系统测试关系? 10 35、软件测试的文档测试应当贯穿于软件生命周期的全过程,其中用户文档是文档测试的重点。那么软件系统的用户文档包括哪些? 10 36、软件系统中除用户文档之外,文档测试还应该关注哪些文档? 10 37、简述软件系统中用户文档的测试要点? 11 38、单元测试主要内容是什么? 11 39、如何理解强度测试? 13 40、如何理解压力、负载、性能测试测试? 13 41、什么是系统瓶颈? 13 42、文档测试主要包含什么内容? 13 43、功能测试用例需要详细到什么程度才是合格的? 14 44、配置和兼容性测试的区别是什么? 14 45、软件文档测试主要包含什么? 15 46、没有产品说明书和需求文档地情况下能够进行黑盒测试吗? 15 47、测试中的“杀虫剂怪事”是指什么? 15 48、在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题? 15 49、为什么尽量不要让时间有富裕的员工去做一些测试? 16 50、完全测试程序是可能的吗? 16 51、软件测试的风险主要体现在哪里? 16 52、发现的缺陷越多,说明软件缺陷越多吗? 16 53、所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗? 17 54、软件测试人员就是QA吗? 17 55、如何减少测试人员跳槽带来的损失? 17 56、测试产品与测试项目的区别是什么? 17 57、和用户共同测试(UAT测试)的注意点有哪些? 18 58、如何编写提交给用户的测试报告? 18 59、测试工具在测试工作中是什么地位? 18 60、什么是软件测试,软件测试的目的? 18 61、简述负载测试与压力测试的区别。 19 62、写出bug报告流转的步骤,每步的责任人及主要完成的工作。 19 63、写出bug报告当中一些必备的内容。 19 64、开发人员老是犯一些低级错误怎么解决? 20 65、画出软件测试的V模型图。 20 66、为什么要在一个团队中开展软件测试工作? 20 67、您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作? 20 68、您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试、性能测试……) 20 69、您认为做好测试用例设计工作的关键是什么? 21 70、请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。 21 71、测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的? 22 72、您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 22 73、请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。 23 74、您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。 23 75、你对测试最大的兴趣在哪里?为什么? 23 76、你以前工作时的测试流程是什么? 24 77、当开发人员说不是BUG时,你如何应付? 24 78、软件的构造号与版本号之间的区别?BVT(BuildVerificationTest) 24 79、您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录? 25 80、您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程。 25 81、您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么? 25 82、单元测试、集成测试、系统测试的侧重点是什么? 25 83、集成测试通常都有那些策略? 25 84、一个缺陷测试报告的组成 25 85、基于WEB信息管理系统测试时应考虑的因素有哪些? 25 86、软件测试项目从什么时候开始,?为什么? 26 87、需求测试注意事项有哪些? 26 88、简述一下缺陷的生命周期 26 89、你在你所在的公司是怎么开展测试工作的?是如何组织的? 26 90、你认为理想的测试流程是什么样子? 26 91、您在从事性能测试工作时,是否使用过一些测试工具?如果有,请试述该工具的工作原理,并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。 26 92、软件测试活动的生命周期是什么? 26 93、请画出软件测试活动的流程图? 26 94、针对缺陷采取怎样管理措施? 26 95、什么是测试评估?测试评估的范围是什么? 26 96、如果能够执行完美的黑盒测试,还需要进行白盒测试吗?为什么? 26 97、测试结束的标准是什么? 26 98、软件验收测试除了alpha ,beta测试以外,还有哪一种? 26 99、做测试多久了?以前做过哪些项目?你们以前测试的流程是怎样的?用过哪些测试工具? 27 100、请就如何在开发中进行软件质量控制说说你的看法 27 101、一套完整的测试应该由哪些阶段组成?分别阐述一下各个阶段。 27 102、软件测试的类型有那些?分别比较这些不同的测试类型的区别与联系。 27 103、测试用例通常包括那些内容?着重阐述编制测试用例的具体做法 27 104、在分别测试winform的C/S结构与测试WEB结构的软件是,应该采取什么样的方法分别测试?他们存在什么样的区别与联系? 27 105、在测试winform的C/S结构软件时,发现这个软件的运行速度很慢,您会认为是什么原因?您会采取哪些方法去检查这个原因? 27 106、描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程 27 107、你都用什么测试方法 针对不同的产品或者系统或者模块,有不同的测试方法。总体而言有白盒测试和黑盒测试。 27 108、怎么编写案例 案例的编写与测试阶段的定义有很大的关系。系统测试和unit测试的案例可能不同。总体而言测试案例根据系统的需求而定。 27 109、怎么才能够全面的测试到每一个点 测试的全面性主要需要在设计测试计划的时候考虑,从测试策略,产品需求等等多个角度考虑从而定义全部的测试点。 27 110、谈谈软件测试技术,以及如何提高 27 111、谈谈软件测试职业发展,以及个人的打算 27 112、谈谈软件测试在企业的地位,也可以结合软件生命周期来谈 27 113、一般公司里实际的软件测试流程是什么样的?你们公司又是怎样的? 27 114、软件工程师要具有那些素质? 27 115、你会哪些测试工具?怎么操作? 27 116、你能不能说下你的3到5年的职业计划(规划) 27 117、你觉得你来应聘有那些优势? 27 其他问题:(有可能清晰的思路比确切的答案更重要) 27 开发及环境搭建类面试题 28 1、描述软件产生内存泄露的原因以及检查方式。(可以结合一种开发语言进行描述) 28 2、简述什么是值传递,什么是地址传递,两者区别是什么? 28 3、结构化程序设计和面向对象程序设计各自的特点及优缺点是什么? 28 4、简述什么是存储过程和触发器? 28 5、使用C语言编写一个函数,用于交换两个变量的值(地址传递)。 29 6、请简述DNS、活动目录、域的概念。 29 7、描述TCP/IP协议的层次结构,以及每一层中重要协议。 29 8、简述子网掩码的用途。 29 9、说出4种以上常用的操作系统及其主要的应用范围(微软的操作系统除外)。 29 10、在Linux系统中,一个文件的访问权限是755,其含义是什么? 29 11、Windows操作系统中PATH环境变量的作用是什么? 30 12、Ghost的主要用途和常用方法? 30 13、在RedHat中,从root用户切到userl用户,一般用什么命令? 30 14、Linux中,一般怎么隐藏文件? 30 15、如何将自己的本地磁盘(D)做成FTP供远端主机使用? 30 16、对RUP.CMM,CMMI,XP,PSP.TSP的认识? 30 17、DNS是什么,它是如何工作的? 31 18、防火墙如何保证安全的?主要有哪些? 31 19、目前流行的操作的系统有哪些?请举例说明安装操作系统的注意事项? 33 20、简述一下c/s模式或者b/s模式? 33 21、TCP/UDP有哪些区别? 34 22、ISO模型?HUB、tch、Router是ISO的第几层设备? 34 23、内存有哪几种存储组织结构.请分别加以说明? 34 人力资源面试题 34 1、你的测试职业发展是什么?你自认为做测试的优势在哪里? 34 2、你为什么想离开目前的职务? 34 3、你对我们公司了解有多少? 34 4、你找工作时,最重要的考虑因素为何? 34 5、为什么我们应该录取你? 34 6、请谈谈你个人的最大特色。 34 7、一个测试工程师应具备那些素质和技能? 35 8、您认为在测试人员同开发人员的沟通过程中,如何提高沟通的效率和改善沟通的效果?维持测试人员同开发团队中其他成员良好的人际关系的关键是什么? 35 9、在您以往的测试工作中,最让您感到不满意或者不堪回首的事情是什么?您是如何来对待这些事情的? 35 10、在即将完成这次笔试前,您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面) 35 11、为什么选择测试这行? 35 12、你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么) 35 13、通常你对于别人批评你会有什么样的反应 35 14、如果明知这样做不对,你还会依主管的指过去做吗? 35 15、如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理? 35 16、请就软件测试人员应该具备什么样的基本素质说说你的看法。 36 17、你在五年内的个人目标和职业目标分别是什么? 36 18、你怎样做出自己的职业选择? 36
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值