记:应聘科大讯飞 C++工程师

电话面

我可能是因为内推,免了笔试。接到hr的电话有点意外。
电话面面的很惨,记录几个问题吧。

1.C++是如何识别两个重载的函数的?

(以下内容摘自:百度百科)

void S();
void S(int);
void S(double,double=1.2);
void S(constchar*,constchar*);
void Max(int,int);
//……
int main()
{
S(2.4);
return 0;
}

那么好,问题出现了。S(2.4);将调用上面四个函数中的哪一个呢?
①.编译器判断重载函数的第一步是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。上面的前四个函数都可以成为候选函数(当然可以是多个),而唯有Max(int,int) 被排除在外了。
②.编译器判断重载函数的第二步分为两动作。
第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同(如S(int)),或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值(如 S(double,double =1.2))。
第二个动作是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。上面的函数中只有两个是可行函数,它们分别是S(int); S(double,double)。
如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。
③.编译器判断重载函数的第三步是从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。

(以下摘自另一篇博客。)
C++代码在编译时会根据参数列表对函数进行重命名,例如void Swap(int a, int b)会被重命名为_Swap_int_int,void Swap(float x, float y)会被重命名为_Swap_float_float。当发生函数调用时,编译器会根据传入的实参去逐个匹配,以选择对应的函数,如果匹配失败,编译器就会报错,这叫做重载决议(Overload Resolution)。(不同的编译器有不同的重命名方式,这里仅仅举例说明,实际情况可能并非如此。)(从这个角度讲,函数重载仅仅是语法层面的,本质上它们还是不同的函数,占用不同的内存,入口地址也不一样。)

2.有没有用过docker等容器。
3.DFS和BFS的时间和空间占用情况。

DFS的空间复杂度是O(V),时间复杂度看使用的存储结构。邻接矩阵的话是O(V*V),邻接表是O(V+E).
BFS同上。

4.TCP的三次握手和四次挥手干了啥?

三次握手:①.客户端向服务器端发送请求;②.服务器端回应客户端的请求(之后,客户端建立连接);③.客户端发送给服务器端一个信息(之后,服务器端建立连接)。
四次挥手:①.客户端向服务器端发送断开连接请求;②.服务器端回应一个信息,表示已经收到了,但是暂时还有数据没传完;③.服务器端传完数据了,再发送一个信息过去,现在数据传送结束了;④.客户端发送一个信息给服务器端,服务器端收到后就断开连接,客户端在发完信息之后,等待2MSL的时间自动断开连接。

5.还有关于网络的几道题,都没听过。。。
6.还有一些题,不知道在考啥。。没听懂。。

两周没消息,凉了。

你可能感兴趣的:(大四求职)