logo资料库

202003-202009秋招面试准备.docx

第1页 / 共47页
第2页 / 共47页
第3页 / 共47页
第4页 / 共47页
第5页 / 共47页
第6页 / 共47页
第7页 / 共47页
第8页 / 共47页
资料共47页,剩余部分请下载后查看
自我介绍
(1)模板发言
(2)对公司的了解:
(3)对岗位的了解:
(4)对自己的了解:
面经:C++相关
1.说一下static关键字的作用:数据/函数;全局/局部;类不类
2.说一下C++和C的区别:
3. (const) (volatile) 类型 (const) (volatile)*(const
4.说一说c++中四种cast转换
5.请说一下C/C++ 中指针和引用的区别?
6.给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内
7.请你说一下你理解的c++中的smart pointer四个智能指针
8.请回答一下数组和指针的区别
9.请你回答一下野指针是什么?
10.请你回答一下智能指针有没有内存泄露的情况
11.请你来说一下智能指针的内存泄漏如何解决
12.请你回答一下为什么析构函数必须是虚函数?
为什么C++默认的析构函数不是虚函数?
13.请你来说一下函数指针
14.请你来说一下fork函数
15.请你来说一下C++中析构函数的作用
17.请你来说一下静态函数和虚函数的区别
18.请你来说一说重载和重写/覆盖/override
19.请你说一说你理解的虚函数和多态
20.纯虚函数
21.请你说一说strcpy和strlen
22.左右值及其引用的区别
23.++i 和 i++ 的区别和实现
24. 请你来写个函数在main函数执行前先运行
25.for(int i = 0; i < 20; i--)修改一个字符,使之表示循环20次
26.以下四行代码的区别是什么? const char * arr = "123";
char * brr = "123"; const char crr[] = "123"; char
27.c++ 顶层(top-level)const 和底层(low-level)const
28.请你来说一下C++里是怎么定义常量的?常量存放在内存的哪个位置?
29.const
30.如果同时定义了两个函数,一个带const,一个不带,会有问题吗?
31.请你来说一说隐式类型转换
32.请你来说一说C++函数栈空间的最大值
33.请你来说一说extern“C”
34.请你回答一下new/delete与malloc/free的区别是什么
35.运行时类型信息 (RTTI)
36.请你说说虚函数表具体是怎样实现运行时多态的?
37.请你说说C语言是怎么进行函数调用的?
38.请你说说C语言参数压栈顺序?
39.请你说说C++如何处理返回值?
40.C/C++中的实参和形参
(2)实参传递给形参方式
(3)引用传递和指针传递有什么区别吗?==引用和指针的区别
(4)指针传递和引用传递一般适用于
41.拷贝构造函数
(2)调用时机:已存在A b,A func(A x){return x;},不存在a对象
(4)如何减少拷贝构造函数使用次数:
42.赋值函数(赋值运算符)及其和拷贝构造函数,构造函数的区别
43.深拷贝和浅拷贝(位拷贝)
44.若类中有指针型数据成员,类的哪几个函数的需要重写
45.请你说说select,epoll的区别,原理,性能,限制都说一说
46.wait()和exec()
47.请你来说一下map和set有什么区别,分别又是怎么实现的?
48.请你来介绍一下STL的allocaotr /C++ STL 的内存优化
49.请你来说一说STL迭代器删除元素
50.请你说一说STL中MAP
51.请你讲讲STL基本组成和分类
52.请你说一说vector和list的区别
53.请你来说一下STL中迭代器的作用,有指针为何还要迭代器
56.请你回答一下STL里resize和reserve的区别
57.请你来说一下C++中类成员的访问权限 / 封装
58.template
59.请你来说一下C++中struct和class的区别
60.请你回答一下C++类内可以定义引用数据成员吗?
61.请你来说一下一个C++源文件从文本到可执行文件经历的过程?
62.请你来回答一下include头文件的顺序以及双引号””和尖括号<>的区别?
63.请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?
64.请你说一说C++的内存管理/内存分配是怎样的?
65.请你回答一下什么是内存泄漏及其分类,以及如何判断内存泄漏?
66.请你来说一下什么时候会发生段错误
68.请你来说一下reactor模型
69.请自己设计一下如何采用单线程的方式处理高并发
70.C 实现 C++ 类
71.请问C++11有哪些新特性?
72.请你详细介绍一下C++11中的可变参数模板、右值引用和lambda /ˈlæmdə/ 这几个新特性。
73. this 指针
74.inline 内联函数
75.assert()
76.#pragma pack(n)
77.位域
78.union 联合
79.explicit(显式)关键字
80.friend 友元类和友元函数
81.using
82.:: 范围解析运算符
83.enum 枚举类型
84.decltype
85.有些场合必须要用初始化列表:少了一次调用默认构造函数的过程
86.虚继承
87.抽象类、接口类、聚合类
88.malloc、calloc、realloc、alloca
89.delete this 合法吗?
90.请你回答一下git中Merge和rebase区别
91.如何定义一个只能在堆上(栈上)生成对象的类?
面经:操作系统
1.进程与线程
2.进程之间的通信方式以及优缺点
面经:通用问题举例
面经:项目相关
P1写一个LLVM后端 :转换LLVM IR为目标平台的指令/汇编码/机器码-JIT
P2目标无关代码生成器
P3其他知识
自我介绍 (言简意赅&&一分半钟&&对公司的了解&&对岗位的了解对自己了解) (1) 模板发言 1 开场:面试官好,我是 XXX,我本科和硕士就读于同济大学计算机科学与技术 专业; 2 (是什么)对工作的理解:xx 公司是我一直非常尊敬的公司(价值观/公司最 大成就),这次我应聘的是 xx 的工作,这个工作对 xx 很有要求; 3 (为什么)为什么适合/选择这个工作:我一直觉得我很适合 xx 相关的工作; 1) 性格,兴趣 2) 相关背景,经验 4 (怎么做)为这个工作所作准备:为此,在研究生阶段我也结合该岗位的要求 进行了相应的准备; 1) 理论方面主要主动学习了 xx 知识 2) 实践方面主要参与了 xx 项目的 xx 部分的设计与实现 5 结尾:希望能加入贵公司从事 xx 相关的工作,我相信我有能力能够胜任这份 工作 (2) 对公司的了解: 1 价值观+工作氛围 2 主营业务+产品业务逻辑 3 发展趋势+用户规模+活跃情况 4 产品痛点+深入具体一点+相应的解决策略 5 融资情况+行业排名+口碑+竞争对手 (3) 对岗位的了解: 1 找专业人员的知乎/博客/论坛/微博等 (4) 对自己的了解: 1 喜欢什么工作氛围,领导风格, 2 最大优点和缺点 3 以往最大成就和最大失败 4 未来 3~5 年的职业规划
面经:C++相关 牛客网 https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21 https://github.com/huihut/interview#-cc 1. 说一下 static 关键字的作用:数据/函数;全局/局部;类不类 (1) 名称+存储+初始化+作用域 (2) 全局静态变量:其他文件不可见 (3) 局部静态变量:局部语句/函数结束后并没有销毁,还在内存中 (4) 静态(全局)函数:一般 cpp 声明 static,头文件声明非 static(多个文件复用) (5) 类的静态成员: 1 不是对象成员,不通过对象名引用;是类成员,通过类名引用 2 一个类,多个对象,共享一个类静态数据/函数 3 类静态函数只能引用类静态数据,不能直接引用非静态数据(属于对象成员), 但可以间接通过对象名来引用非静态数据 2. 说一下 C++和 C 的区别: 3. (volatile) 类型 (const) (volatile)*(const) (1) 面向对象;面向过程的结构化编程 (2) 封装,继承,多态,抽象+类型安全:强制类型转换+范式编程:模板类,模板函数 (const) (1) volatile 修饰的对象可能因为程序外的因素而改变;告诉编译器不对该对象进行优 化(比如从内存取出放到寄存器的优化,便于快速访问),每次访问都是重新从内存取出 (2) 不与 const 互相矛盾,因为 const 修饰的对象表示不能因为程序内的因素而改变, (volatile)p;const volatile 类型 i 因为程序外的因素而改变在 const 眼里还是常量不可变的 (3) volatile 可以修饰指针:volatile 类型 volatile*volatile p 4. 说一说 c++中四种 cast 转换 (1) const_cast:用于删除 const、volatile 和 __unaligned 特性(如将 const int 类型转 换为 int 类型 ) (2) static_cast: 1 非多态类型转换+编译时类型检查(安全性低于 dynamic_cast) 2 内置类型转换(低精度->高精度,非 const->const,int->long long) 3 多态向上转化安全 4 多态向下转化不安全,因为子类可能比父类多出一些新成员 (3) dynamic_cast 1 多态类型转换+运行时进行类型检查 2 用于虚函数的类层次间的指针/引用的向上/向下转化 1) 指针转换失败返回 nullptr 2) 引用转换失败抛出 bad_cast 异常 (4) reinterpret_cast: 1 低级别转换:用于位的简单重新解释 2 几乎都能转,但对转换的结果不安全 3 4 reinterpret_cast 运算符不能丢掉 const、volatile 或 __unaligned 特性。 reinterpret_cast 的一个实际用途是在哈希函数中,即,通过让两个不同的值几 乎不以相同的索引结尾的方式将值映射到索引。 (5) 为什么不使用 C 的强制转换? double d=(double)intA;不进行错误检查,易出错
5. 请说一下 C/C++ 中指针和引用的区别? (1) 指针:有属于自己的一块存储空间,大小为 4,本身存储内容为内存地址,必须通 过*解引用才能对指向对象进行操作,解引用可以有多级***;可初始化为 nullptr;可以对指 针或者指针指向对象进行 const 限定;动态内存分配必须用指针 (2) 引用:只是一个别名,大小为引用对象的大小,对引用操作就是对所引用对象操作, 引用只能有一级;引用必须被初始化引用一个已有对象;没有 const 引用;只能引用一个对 象 6. 给定三角形 ABC 和一点 P(x,y,z),判断点 P 是否在 ABC 内 (1) 求三角形面积 1 2 行列式计算,三个对角线相乘-三斜对角线相乘 s=sqrt(p(p-a)(p-b)(p-c)),p=(a+b+c)/2 a,b,c 是三条边长 (2) 比较三个小面积和 和 大面积 1 错误:三个小面积和==大面积 2 正确:-0.0001<三个小面积和-大面积<0.0001 7. 请你说一下你理解的 c++中的 smart pointer 四个智能指针 (1) 自动释放内存问题;是个类 (2) auto_ptr: c++11 弃用,内存奔溃 p2=p1 后在访问 p1 1 2 不能管理数组(析构调用 delete) (3) unique_ptr:替代 auto_ptr,不能多个指针指向一个对象, p2=p1 报错;p2=unique_ptr(new int(5));临时右值可以;p2=move(p1);可以 1 独占式拥有/严格拥有,避免资源泄漏 2 可以管理数组(析构调用 delete[] ) 3 shared_ptr:多个指针指向同一对象 1 共享式拥有 2 成员函数:use_count,unique,swap,reset,get (4) (5) weak_ptr: 1 允许你共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有 权,任何 weak_ptr 都会自动成空(empty) 2 只提供 “接受一个 shared_ptr” 的构造函数 3 可打破环状引用问题:两个其实已经没有被使用的对象彼此互指,使之看似还 在 “被使用” 的状态 8. 请回答一下数组和指针的区别
9. 请你回答一下野指针是什么? (1) 指向一个已删除的对象或者未申请访问受限内存区域的指针 10. 请你回答一下智能指针有没有内存泄露的情况 (1) shared_ptr 环状引用 11. 请你来说一下智能指针的内存泄漏如何解决 (1) weak_ptr 12. 请你回答一下为什么析构函数必须是虚函数? 为什么 C++默认的析构函数不是虚函数? (1) 可以保证当我们 new 一个子类,然后使用基类指针指向该子类对象,释放基类指 针时可以释放掉子类的空间,防止内存泄漏。 (2) 只有当需要当作父类时,才在父类设置为虚函数形式的析构函数;不需要子类则不 需要设置析构函数为虚函数,因为虚函数需要额外的空间开销:虚函数表和虚函数 表指针 13. 请你来说一下函数指针 (1) 定义:指向函数入口地址的指针 (2) 用途:函数调用+作为函数参数(回调函数) (3) 14. 请你来说一下 fork 函数 2 (1) (2) (3) int res=fork()返回值:一次创建,两次返回 1 <0:创建子进程错误 ==0:创建成功,当前是子进程 >0:创建成功,当前是父进程,返回值为父进程编号 3 fork 是将主进程的资源全部拷贝了一份给子进程,包括指令,变量值,程序调用栈, 环境变量,缓冲区,等等,两个进程的资源是相互独立的 fork 程序题分析思路:https://www.cnblogs.com/ittinybird/p/4492098.html
15. 请你来说一下 C++中析构函数的作用 (1) 当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函 数 (2) ~类名():没有返回值,没有参数 (3) 一个类只能有一个析构函数,不能重载 (4) 缺省自动隐式生成一个析构函数;自定义析构函数后,编译器也会为我们合成一个 空操作的析构函数,先执行自定义析构函数,再执行合成的析构函数 (5) 一般是类中有指针并且动态申请了内存,这种情况最好自定义析构函数释放内存, 避免内存泄露 (6) 当你需要继承生成派生类并用基类指针指向派生类是最好把析构函数定义成虚析 构函数 (7) 类析构顺序:子类/派生类的析构函数->当前类的析构函数->基类/父类析构函数 16. 虚析构函数 (1) 为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。 17. 请你来说一下静态函数和虚函数的区别 (1) 静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。 (2) 虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销 18. 请你来说一说重载和重写/覆盖/override (1) 重载多态: 1 两个函数名相同,但是参数列表不同(个数,类型),返回值类型没有要求, 在同一作用域中 2 重载函数可以是类成员函数,也可以是普通函数 (2) 重写/覆盖(子类型多态-虚函数):子类继承了父类,父类中的函数是虚函数,在 子类中重新定义了这个虚函数,这种情况是重写 19. 请你说一说你理解的虚函数和多态 (1) 虚函数:用 virtual 修饰成员函数,支持用基类指针指向之类对象进行操作 1 普通函数:(非类成员函数)不能是虚函数 2 构造函数:不能是虚函数(因为在调用构造函数时,虚表指针并没有在对象的 内存空间中,必须要构造函数调用完成后才会形成虚表指针) 3 静态函数:不能是虚函数 4 内联函数:inline virtual 1) 不能是表现多态性时的虚函数:基类指针指向子类,调用重写的虚函数; 因为是动态多态,即运行时绑定,运行时不发确定是基类还是子类
2) 可以是没有表现多态性的虚函数:子类指针/引用调用重写的虚函数 (2) 多态: 1 静态多态:编译时绑定 1) 重载多态:函数重载/运算发重载;函数名/运算符相同,参数个数和类型 不同 2) 参数多态:类模板,函数模板;参数名称一样,却根据实际调用情况去欸 的功能参数类型 2 动态多态:运行时绑定 1) 子类型多态:虚函数重写,基类指针指向子类,调用重写的虚函数 3 强制多态:类型转换 20. 纯虚函数 (1) 定义了虚函数却没有实现:virtual int A() = 0; (2) 抽象类: 1 拥有纯虚函数的类(自己定义纯虚函数/继承抽象类却不实现) 2 派生类可以是抽象类,也可以是普通类 3 不能实例化/定义对象,只能由派生的非抽象类实例化 21. 请你说一说 strcpy 和 strlen strcpy 是字符串拷贝函数,原型:char *strcpy(char* dest, const char *src); (1) (2) 从 src 逐字节拷贝到 dest,直到遇到'\0'结束,因为没有指定长度,可能会导致拷贝 越界,造成缓冲区溢出漏洞,安全版本是 strncpy(dst,src,sizeof(dst))//对于字符来说 sizeof 是检查对象存储的字节个数,1 字节大小就是一字符大小,所以 sizeof 等于 size strlen 函数是计算字符串长度的函数,返回从开始到'\0'之间的字符个数。 (3) 22. 左右值及其引用的区别 (1) 左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持 久对象。 (2) 右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对 象。 (3) 左右值引用的区别 1 根本区别:左值可以寻址(&表示内存地址),而右值不可以。 2 左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。 3 左值可变,右值不可变(仅对基础类型适用,用户自定义类型右值引用可以通 过成员函数改变)。 23. ++i 和 i++ 的区别和实现 (1) 区别: i++返回的是 i 的值, ++i 返回的是 i+1 的值; ++i 可以用作左值,i++不行 1 2 (2) ++i int& int::operator ++ (){ *this +=1; return *this; (3) } i++ const int int::operator ++ (int){
int oldValue = *this; ++(*this); return oldValue; } 24. 请你来写个函数在 main 函数执行前先运行 void xxx() __attribute((constructor)); (1) __attribute((constructor)) static void function(){...} (2) (3) __attribute((constructor(intX))):优先级,一般 0~100 是保留级别,建议从 101 开始 for(int i = 0; i < 20; i--)修改一个字符,使之表示循环 20 次 (1) void xxx(){...} 25. for(int i = 0; i + 20; i--) 26. 以下四行代码的区别是什么? const char * arr = "123"; char * brr = "123"; const char crr[] = "123"; char drr[] = "123"; (1) 字符串 123 保存在常量区,const 本来是修饰 arr 指向的值不能通过 arr 去修改,但 是字符串“123”在常量区,本来就不能改变,所以加不加 const 效果都一样 (2) 字符串 123 保存在常量区,这个和 arr 指针指向的是同一个位置,同样不能通过 brr 去修改"123"的值 (3) 这里 123 本来是在栈上的,但是编译器可能会做某些优化,将其放到常量区 (4) 字符串 123 保存在栈区,可以通过 drr 去修改 27. c++ 顶层(top-level)const 和底层(low-level)const (1) 顶层 const 指的是指针本身是一个常量,底层 const 指的是指针所指的对象是一个 常量。 (2) 修饰指针:const 类型 const * const p 1 类型左边的都是底层 const 2 类型右边两个都是顶层 const (3) 修饰一般变量:const 类型 &i 1 有引用&符号的都是底层 const 2 没有则是顶层 const 28. 请你来说一下 C++里是怎么定义常量的?常量存放在内存的哪个位置? top-level const 加上对象类型,常量定义必须初始化:const int i=1; (1) (2) 局部对象 i:栈区 (3) 全局对象 i:全局/静态存储区 (4) 字面值常量 1:常量存储区 29. const (1) 作用 1 修饰变量:该变量不可改变; 2 修饰指针 1) 底层 const:指向对象不可变 const int *p; 2) 顶层 const:自身不可变(常量指针)int const *p; int * const p; 3 修饰引用, 1) 底层 const:引用对象不可变, const int &p; 主要用于形参避免拷贝 2) 没有(常量引用说法)int const & const p 形式,因为引用&本身就是常量 指针 4 修饰成员函数,说明该成员函数内不能修改成员变量。 30. 如果同时定义了两个函数,一个带 const,一个不带,会有问题吗?
(1) 不会,这相当于函数的重载。 31. 请你来说一说隐式类型转换 (1) 首先,对于内置类型,低精度的变量给高精度变量赋值会发生隐式类型转换, (2) 其次,对于只存在单个参数的构造函数的对象构造来说,函数调用可以直接使用该 参数传入,编译器会自动调用其构造函数生成临时对象。 32. 请你来说一说 C++函数栈空间的最大值 (1) 默认是 1M,不过可以调整 33. 请你来说一说 extern“C” (1) 被 extern "C" 修饰的变量和函数是按照 C 语言方式编译和链接的 (2) 让 C++ 编译器将 extern "C" 声明的代码当作 C 语言代码处理,可以避免 C++ 因 符号修饰导致代码不能和 C 语言库中的符号进行链接的问题。 (3) C++调用 C 函数需要 extern C,因为 C 语言没有函数重载。 34. 请你回答一下 new/delete 与 malloc/free 的区别是什么 (1) new 在申请内存时会自动计算所需字节数;没有扩容操作;返回的是指向对象的 指针不用强转;分配失败抛出 bad_malloc 异常; (2) malloc 则需我们自己输入申请内存空间的字节数;申请空间不足时调用 realloc 扩 容;返回的是 void*,需要强转。分配失败返回 NULL; (3) new / new[]: 1 完成两件事,先一次底层调用 malloc 分配了内存,然后一次调用构造函数(创 建对象) 2 一次+多次 (4) delete/delete[]: 1 也完成两件事,先一次调用析构函数(清理资源),然后一次底层调用 free 释 放空间。 2 一次+多次 (5) new/delete 是 C++的关键字,是一个操作符可以重载,而 malloc/free 是 C 语言的库 函数 35. 运行时类型信息 (RTTI) (1) dynamic_cast:虚函数多态向下安全转化 (2) (3) 上述两个操作都会查询 type_info typeid:基类 *p=new 子类; typeid(p)表示基类 36. 请你说说虚函数表具体是怎样实现运行时多态的? != typeid(*p)表示子类; (1) 子类若重写父类虚函数,虚函数表中,该函数的地址会被替换,对于存在虚函数的 类的对象,在 VS 中,对象的对象模型的头部存放指向虚函数表的指针,通过该机 制实现多态。 37. 请你说说 C 语言是怎么进行函数调用的? (1) 每一个函数调用都会分配函数栈,在栈内进行函数执行过程。 (2) 调用前,先把返回地址压栈 (3) 然后把当前函数的 esp 指针压栈。 38. 请你说说 C 语言参数压栈顺序? (1) 从右到左 39. 请你说说 C++如何处理返回值? (1) 生成一个临时变量,把它的引用作为函数参数传入函数内。 40. C/C++中的实参和形参
分享到:
收藏