常见面试问题总结(持续更新)

注:内容大多来自互联网,只是做了一个总结工作

一.c++相关

1.new和malloc

  • new、delete是操作符,可以重载,malloc、free是函数,可以覆盖
  • new、delete可以调用对象中的构造函数和析构函数,malloc、free仅仅分配内存和释放内存
  • new、delete返回的是数据类型指针,malloc、free返回的是void指针

2.虚函数与纯虚函数

  • 虚函数可以实现多态,虚函数在基类中有定义,子类中可以重写也可以不重写该虚函数
  • 子类中重写的虚函数可通过父类的指针去访问
  • 纯虚函数类似函数的声明,需要在子类中去实现
  • 纯虚函数可理解为虚函数的子集

3.sizeof与strlen

  • sizeof是操作符,strlen是函数
  • sizeof的参数可以是数据类型、变量,strlen的参数只能是以'\0'结尾的字符串
  • 编译时就算出了sizeof的结果,运行时算出strlen的结果
  • sizeof计算的是数据类型占内存的大小,strlen是字符串的长度

  eg.char* s="abc"; sizeof(s) 4字节,strlen(s) 3字节.  double a[3] sizeof(a) 24

  sizeof(bool)、sizeof(char) 1字节,

  sizeof(short) 2字节,

  sizeof(void*)sizeof(char*)sizeof(string*)、sizeof(int)、sizeof(float) 4字节,

      sizeof(double) 8字节,

      sizeof(string) 16字节

4.c++空类

 1 class Empty
 2 {
 3     public:
 4       Empty(); // 缺省构造函数
 5       Empty(const Empty&); // 拷贝构造函数
 6       ~Empty(); // 析构函数
 7       Empty& operator=(const Empty&); // 赋值运算符
 8       Empty* operator&(); // 取址运算符
 9       const Empty* operator&() const; // 取址运算符 const
10 };

5.int类型的取值范围

  int,32位,第一个字节为符号位。-2^31------2^31-1 

  unsigned int,32位,没有符号位。0-------2^32-1

  double精度小数点后15位(不确定),float精度小数点后6位

6.位运算

  计算机中对数的运算均采用补码(举例采用8位二进制)

  ~:非运算,单目运算符1为0,0为1;

  &:与运算,都为1则为1,否则为0

  |:或运算,全为0则为0,否则为1

  ^:异或运算,相同为0,不同为1

  >>:右移操作符,负数右移,补码左边补1  

    eg:100   0110 0100  100>>1  50,100>>2 25,100>>3 12

     -100   (1001 1100)补  -100>>1 (1100 1110)补=(1011 0010)原=-50  -100>>3  (1111 0011)补=(10001101)原=-13

  <<:左移操作符,负数左移,补码右边补0

    eg:100   01100100  100<<1 72,100<<2 16,100<<3 32(不要跟我说用c++int算的是200,400,800,那是32位,此处用8位2进制说明原理)

      -100  -100<<1  -72,-100<<2  -16,-100<<3  -32

      -10    -10<<1  -20,-10<<2 -40,-10<<3 -80

7.指针和引用

  相同点:

    都表示地址,指针指向一块内存,值为内存地址,引用是内存的别名

  不同点:

    指针是一个实体,引用是一个别名

    指针使用时*

    指针可以改变,引用在初始化后就不能改变了

    有const指针,没有const引用

    指针可以为空,引用不行

    sizeof指针为指针大小,sizeof引用为所指变量的大小

    自增含义不同,引用++表示所指变量++,指针++表示指向后面的地址

    程序为指针分配内存,不为引用分配内存

 

8.*p,&p,*&p,&*p

    int a=10;

    int *p=&a;    //指向变量a的指针p        输出*p  = 10

    int &q=a;  //q是变量a的引用                          输出q = 10

    int *&r=p;    //r是指针p的引用                          输出*r = 10

    int &*s;      //s是指针,指向引用,错误的写法

 

9.#ifndef #define #endif

    解决头文件被多次引用产生冲突的问题

    eg. a.h引用了b.h和c.h,b.cpp引用了a.h和c.h,则c.h被重复使用,

    #ifndef <标识>    //标识唯一,通常命名格式:stdio.h对应 _STDIO_H_

    #define <标识>

    ......

    #endif   

二.操作系统相关

1.进程和线程

  进程:一个程序对一个数据集的动态执行过程,是资源分配的基本单位

  线程:进程的一个实体,是CPU调度的基本单位

  进程有独立的地址空间,同一进程内的多个线程共享进程的地址空间,线程必须依托进程执行

三.网络相关

1.常见端口及对应的服务

  ftp:21,ssh:22,telnet:23,smtp:25,domain:53,http:80,pop3:110,ntp:123

  mysql:3306,shell:514,sqlserver:1433

四.组成原理相关

1.原码、补码、反码

  以8位2进制举例子

    正数100 负数-100

  原码:01100100 11100100 第一位表示符号位

    反码:01100100 10011011 正数的反码和原码相同,负数的反码 符号位不变,后面取反

    补码:01100100 10011100 正数的补码和原码相同,负数的补码即为反码+1

  补码再求补码即得到原码

      理论上说8位2进制表示的范围为   -127-------127

      可是计算机存储的范围是            -128-------127

      原因:解决-0的问题,计算机采用补码进行运算  

       1+(-1)   =(0000 0001)原+(1000 0001)原=(0000 0001)反+(1111 1110)反=(0000 0001)补+(1111 1111)补=(0000 0000)补

  -1+(-127)=(1111 1111)补+(1000 0001)补=(1000 0000)补=((1111 1111)+1)原=-128

       相当于在补码表示中用-128代替-0,-128没有原码和反码                  

 

 

posted @ 2015-06-12 10:21  影翕  阅读(173)  评论(0编辑  收藏  举报