春招面试题

1. 构造函数无返回值,原因?

构造函数和析构函数无返回值。在程序中创建和消除一个对象的行为非常特殊,就像出生和死亡,而且总是由编译器来调用这些函数以确保它们被执行。

如果它们有返回值,要么编译器必须知道如何处理返回值,要么就只能由客户程序员自己来显式地调用构造函数与析构函数,这样一来,安全性就被破坏了。另外析构函数不带任何参数,因为析构不需任何选项。

如果允许构造函数有返回值,在某些情况下,会引起歧义。(隐式的类类型转换)

class C{

public:

  C():x(0){}

  C(int i):x(i){}

private:

  int x;

}

如果C的构造函数可以有返回值,比如int:int  C():x(0){return 1;}//1表示构造成功,0表示失败。

那么当:C c=C(); 时,C()生成临时对象,再用它初始化c。但如果C()有一个int型返回值,在C的构造函数没有用explicit声明时,也可以看作是用int值隐式地对类对象初始化(通过C(int i)这个构造函数)。所以这种情况下产生了歧义。

还有一种情况是用C的构造函数生成的临时对象作为参数的实参:

void f(int a){}

void f(const C&a){}

此时调用f(C())就会产生歧义,是用int值作为实参,还是C对象作为实参。

2. TCP和UDP的区别

-TCP面向连接的,可靠的数据传输服务;UDP面向无连接的,尽最大努力的数据传输服务,不保证数据传输的可靠性。

-TCP面向字节流,UDP面向报文段。应用进程交给UDP多长的报文,UDP就照样发送,一次发送一个报文;TCP在发送时采取的方式完全不同:TCP根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应该包含多少个字节。如果报文太长,TCP会将其拆分再发送,如果报文太短,TCP会等待积累足够多的字节再构成报文段发送出去。

-TCP数据传输慢,UDP数据传输快。

-TCP有拥塞控制,UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有效,如直播,实时视频会议等)

-TCP只能是一对一的通信(TCP连接的端点是套接字socket),而UDP支持一对一、一对多、多对一和多对多的通信。

-TCP的首部开销大,有20字节,比UDP的8个字节的首部要长。

-TCP提供可靠全双边的通信服务。UDP是半双工的,只能单向传播。

3. 堆排序

将数组看作完全二叉树,子节点和父节点之间下标对应关系。第一次调整堆时,从后往前比较子节点和其父节点大小,将最大或最小的节点值交还给父节点,该父节点是以其为根节点的子树的最大或最小值节点,一次递归到下标为0的根节点。将其数组最后一位交换。交换过后对二叉树进行调整时,从根节点按路径迭代到叶子节点,该路径选择依据是与父节点交换的那个叶子节点的分支,当不存在交换时直接结束迭代。

复杂度:第一次从后往前调整时,时间复杂度是n;之后的每一次路径调整时时logn,所以总的时间复杂度是nlogn。

4. 设计模式

猜你喜欢

转载自www.cnblogs.com/cjj-ggboy/p/12410256.html