常见面试问题总结(持续更新)
注:内容大多来自互联网,只是做了一个总结工作
一.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没有原码和反码