上海爱立信面试小结

1、多态中为什么要把父类的析构函数写成虚函数?
虚析构函数,当父类指针或者引用指向子类对象的时候,通常会直接析构父类对象,
而不会析构子类的对象,只有在析构函数前面加上virtual时,就会先析构子类对象,然后再析构父类对象。
虚析构函数是为了避免使用父类指针释放子类对象时造成内存泄露。

2、如果用virtual修饰构造函数会如何?
virtual不能修饰:普通函数、构造函数、 static静态成员函数、inline内联函数

3、explict关键字的用法?什么情况下会使用这个关键字?
什么情况下会使用这个关键字?(在嵌入式当中,如果要读取一些寄存器的值,就要加这个关键字,防止编译器进行优化)
关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。
声明为explicit的构造函数不能在隐式转换中使用。
  C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 2 是个默认且隐含的类型转换操作符。
  所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好是AAA单参数构造器的参数类型, 这时候编译器就自动调用这个构造器, 创建一个AAA的对象。
  这样看起来好象很酷, 很方便。 但在某些情况下(见下面权威的例子), 却违背了我们(程序员)的本意。 这时候就要在这个构造器前面加上explicit修饰, 指定这个构造器只能被明确的调用,使用, 不能作为类型转换操作符被隐含的使用。 呵呵, 看来还是光明正大些比较好。
  explicit构造函数的作用
  解析:
  explicit构造函数是用来防止隐式转换的。请看下面的代码:
  class Test1
  {
  public:
  Test1(int n) { num = n; } //普通构造函数
  private:
  int num;
  };
  class Test2
  {
  public:
  explicit Test2(int n) { num = n; } //explicit(显式)构造函数
  private:
  int num;
  };
  int main()
  {
  Test1 t1 = 12; //隐式调用其构造函数, 成功
  Test2 t2 = 12; //编译错误,不能隐式调用其构造函数
  Test2 t3(12); //显示调用成功
  return 0;
  }
  Test1的构造函数带一个int型的参数,代码19行会隐式转换成调用Test1的这个构造函数。而Test2的构造函数被声明为explicit(显式),这表示不能通过隐式转换来调用这个构造函数,因此代码20行会出现编译错误。
  普通构造函数能够被隐式调用。而explicit构造函数只能被显示调用。

C++中Explicit关键字的理解

按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,Explicit主要是应用于这种情况,避免出现因为隐式转换出现二意性。如下实例说明:

  1. #include <iostream>  
  2. #include <string>  
  3.   
  4. class mystring {  
  5. public:  
  6.     explicit mystring(const char* p);  
  7.     explicit mystring(int n);  
  8. };  
  9.   
  10. mystring::mystring( const char* p )  
  11. {  
  12.     std::cout << p << std::endl;  
  13. }  
  14.   
  15. mystring::mystring( int n )  
  16. {  
  17.     std::cout << n << std::endl;  
  18. }  
  19.   
  20. int main(int argc, char *argv[], char *env[])  
  21. {  
  22.     const char *c = "Hello World!!!";  
  23.     int i = 4;  
  24.   
  25.     mystring mystr1 = mystring(c);  
  26.     mystring mystr2 = mystring(i);  
  27.   
  28.     // 构造函数加上关键字explicit,下面两句编译都过不去  
  29.     // 因为此时这种隐式转换不允许  
  30.     // 所以为了避免二意义性,单参数的构造函数建议要加上explicit  
  31.     mystring mystr3 = c;    // 编译不通过,不允许隐式的转换  
  32.     mystring mystr4 = i;    // 编译不通过,不允许隐式的转换  
  33.   
  34.     return 0;  
  35. }  

 

4、c++ 在函数后加const是什么意思?
 我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。 const成员函数和const对象 实际上,const成员函数还有另外一项作用,即常量对象相关。对于内置的数据类型,我们可以定义它们的常量,用户自定义的类也一样,可以定义它们的常量对象。
 
编程中我们通常写++对象,而不用对象++这是为什么?
 前置比后置效率高 ,后置需要构造临时对象并返回,会调用拷贝构造函数,系统的消耗比较大。
 
 5、你用过智能指针吗?和我说说。
 智能指针主要用于自动释放内存,防止内存泄漏。
 6、你了解设计模式吗?和我说说你都用过哪些?

7、你对网络熟悉吗?TCP/IP

tcp和udp有什么区别?各自有什么应用?

TCP与UDP区别

  1. TCP提供的是面向连接的、可靠的数据流传输;

    UDP提供的是非面向连接的、不可靠的数据流传输。

  2. TCP提供可靠的服务,通过TCP连接传送的数据,无差错、不丢失,不重复,按序到达;UDP尽最大努力交付,即不保证可靠交付。

  3. TCP面向字节流;

    UDP面向报文。

  4. TCP连接只能是点到点的;

    UDP支持一对一、一对多、多对一和多对多的交互通信。

  5. TCP首部开销20字节;

    UDP的首部开销小,只有8个字节。

  6. TCP的逻辑通信信道是全双工的可靠信道;

    UDP的逻辑通信信道是不可靠信道。

TCP定义

TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

UDP定义

UDP (User Datagram Protocol 用户数据报协议)是OSI(Open System Interconnection开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

猜你喜欢

转载自blog.csdn.net/usstmiracle/article/details/83149165