以下为《c 软件工程师面试经验》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
C++与数据结构
1.C++ #include 双引号和尖括号的区别
答案:
不同的搜索路径
双引号:1.当前源文件工作目录2.编译器设置的头文件查找路径3.系统变量C_INCLUDE_PATH指定的头文件路径
尖括号:2.编译器设置的头文件查找路径3.系统变量C_INCLUDE_PATH指定的头文件路径
双引号:自己写的头文件,尖括号:标准库头文件(从标准程序库搜索)
2.C指针和数组的区别与联系
区别:
1.本质上指针是存放一块内存空间的地址,数组是一段连续的内存空间,存放一组类型相同的变量。
2.sizeof指针是4/8,sizeof数组是数组长度
3.赋值上指针可以相互传值,数组只能复制元素
联系:
1.数组名可以作为地址传参给指针
2.数组指针与指针数组
3.多重指针形式初始化多维数组
4.释放数组指针delete后要加[]
vector动态扩容的底层实现
有三个迭代器,myfirst,mylast,myend,有一个属性:容量=myend-myfirst;
容量不足时,在内存中开辟一块新的更大的连续空间,将vector复制过去,引起迭代器和指针引用失效
Reserve可以手动开辟更大的空间
PS:vector对象之间=操作会发生什么?
大容量在左则将右边vector的拷贝到左边vector的起始位置,并修改容量。
大容量在右则重新申请一段空间拷贝右边的vector。
deque的底层实现
其存储空间由多段连续的空间组成,有一个数组称为主控,存放一组地址,其中每个地址包含一段连续的空间的首地址,连续的地址称为缓冲区
Deque维护两个迭代器指向第一缓冲区的第一个元素和最后一个缓冲区的最后一个元素,如果现有空间不满足存放需求,在首端或尾端新配置一段定量的连续空间并接入
Deque的迭代器必须能判断自己是否处于缓冲区的边缘(信息包含所在缓冲区的头尾和当前位置和主控位置),以及能跳回主控前往下一个缓冲区
5.static用在哪些地方,各有什么作用
静态全局变量/函数,指定只有当前文件可以调用
局部变量,变量的值在第一次执行到代码时初始化,不会丢失
类的成员 该实例归类的所有对象共有
类的成员函数 不能访问类的非静态成员
6.指针和引用的区别
指针是变量,用于存放地址;引用是别的变量的别名。
指针可以为空,可以自由修改,引用必须初始化赋值,并且不可以修改
指针需要解引用访问对象,直接对引用操作就是对引用对象的操作
虚函数表原理
一个类如果有虚函数,那么编译器会为其创建虚函数表,存放虚函数的地址;
父类有虚函数,那么子类也会有子类自己的虚函数表,如果子类没有重写虚函数,那么虚表中是父类的虚函数地址;如果子类有自己的虚函数,会放在继承自第一个父类的虚函数表后面,有多少个有虚函数的父类就有多少个虚表和多少个虚表指针。
在构造函数中执行虚表和虚指针的初始化,子类对象的虚指针会指向自己的虚表。
父类指针指向子类对象时调用子类对象的构造函数时虚指针指向子类的虚表;
PS:如果子类没有重写虚函数,指针指向哪?
会指向子类的虚函数表,在内容上和父类的虚函数表一样,但虚函数表地址不一样。
菱形继承
一个类的父类有共同的父类,称为菱形继承,比如B:A,C:A,D:B,C,此时B和C的继承方式为虚继承,A称为虚基类。
虚基类在派生类中只有一个副本,并由构造函数直接对其初始化,而与虚基类的子类的构造函数无关。
虚继承通过虚基类表与虚基类指针实现,虚基类表中存放虚基类到派生类的偏移地址,虚基类指针指向虚基类表,所有继承自虚基类的派生类都通过虚基类表访问 内容过长,仅展示头部和尾部部分文字预览,全文请查看图片预览。 以size最大的结构作为自己的大小,每个数据成员在内存中的起始地址是相同的。
重写重载的区别
重写是子类对基类虚函数的重写
重载是相同作用域里不同参数类型的同名函数,与返回值无关(相同参数返回值不同会报错)
浮点数的二进制表示
最高位是符号位,双精度11位指数位,52位有效数字位,单某某8位指数位,23位数字位;
浮点数表示为 -1^s*2^m*n 第一位是s,指数位是m+1023/127,有效数字位是二进制表示
PS:
1.有符号数的表示?用补码,负数的补码是原码除符号位取反加一
2.有符号数的右移操作?除符号位全部右移,空的位置正数补0,负数补1
操作系统
环境变量
CPU的寄存器
[文章尾部最后300字内容到此结束,中间部分内容请查看底下的图片预览]请点击下方选择您需要的文档下载。
以上为《c 软件工程师面试经验》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。