笔试+面试题目搜集

C++基础语法知识

参考:https://www.nowcoder.com/tutorial/93/a34ed23d58b84da3a707c70371f59c21

1.static关键字作用

(只能初始化一次,后面只能赋值改变变量值)

static变量

全局变量 静态全局变量

生命周期:全局变量和静态全局变量都是从程序运行到程序结束

作用域:全局变量作用域是所有代码
静态全局变量作用域是当前文件

代码段中位置:都是全局数据区

局部变量 静态局部变量

生命周期:局部变量从函数调用到函数返回
静态局部变量是从程序运行到程序结束

作用域:都是函数内部

代码段中位置:局部变量是栈
静态局部变量是全局数据区

static函数

作用域:当前文件可以访问

好处:
linux内核中代码量很大,函数也是数不胜数,所以给函数起名时,可能模块相似,功能相同,名字一起就会起冲突,所以修饰一下,让作用域变成当前文件,就不怕起冲突了。

2.C++和C的区别

设计思想上来说:
C++是面向对象,C是面向过程

语法上来说:
C++有封装继承多态三种特性
C++比C增加了更多类型安全的功能,比如强制类型转化
C++支持泛型编程,比如模板类、函数模板等

3.c++中四种cast转换

(1)const_cast

用于去const

1
2
3
4
5
const string a="123";//无法修改
//取别名来修改
string&b=const_cast<string&>a;
b="456";
cout<<a<<endl;

输出会变成456;

1
2
3
4
const int a=20;//符号表
int&b=const_cast<int&>a;
b=60;
cout<<a<<endl;

输出还是20,但是a的值其实就是60,因为编译器做了优化,20存在符号表当中了,引用时保存在内存中,cout的是找的符号表,但是单独看a和b的地址其实是一样的,内存中的a改变了。

1
2
cout<<&a<<endl;
cout<<&b<<endl;

输出地址一模一样

类型必然是引用或者指针,懂得都得,因为要改变const值的本身,只有两种办法,一种是通过指针指向地址然后改变,另一种是起别名然后改变数值!!

(2)dynamic_cast

一般是强制父类指针转化为子类指针。
因为这样转化了,才能去调用子类独有的成员函数。

(3)static_cast

用于比较自然的、低风险的数据类型的转换。
指针、引用都是高风险的。

1
2
3
double age=20.2;
int age2=static_cast<int>(age);
cout<<age2<<endl;

也可以实现指针转换,但是必须有万能指针来帮助。
不能直接转化指针类型:

1
2
3
4
int age=20;
int *p=&age;
double *pig=static_cast<double *>(p);
//会报错,不能这样转化

用万能指针作为中间变量:

1
2
3
4
int age=20;
int *p=&age;
void* pi=static_cast<void*>(p);
double *pig=static_cast<double *>(pi);
1
2
3
cout<<*p<<endl;
cout<<*pi<<endl;//万能指针不能使用,所以这里报错
cout<<*pig<<endl;

输出都是20,pig会以科学计数法输出。

(4)reinterpret_cast

指针类型之间的转化。

4.C/C++中指针和引用的区别

初始化、赋值、重新赋值、sizeof 这几个方面
反汇编

5.三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码

6.c++中的smart pointer四个智能指针

auto_ptr

被C++11抛弃

unique_ptr

替代了auto_ptr,保证同一时间内只有一个智能指针可以指向该对象,栈分配对象死了就自动delete,避免内存资源泄露

shared_ptr

工作方式是引用计数,可以跟踪指针有多少引用,引用为0就delete掉。
两个shared_ptr互相引用,两个引用计数永远不会为0,资源永远不会释放。

weak_ptr

由于shared_ptr也会存在内存泄漏的情况,所以引入了weak_ptr。
是一种不控制对象生命周期的智能指针,它指向一个shared_ptr管理的对象,weak_ptr知识提供了对管理对象的一个访问手段。是配合shared_ptr工作,用来解决shared_ptr相互引用时的死锁问题。对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。

7.怎么判断一个数是二的倍数,怎么求一个数中有几个1,说一下你的思路并手写代码

8.数组和指针的区别

9.野指针是什么

10.介绍一下C++中的智能指针

11.智能指针有没有内存泄露的情况

12.智能指针的内存泄漏如何解决

13.为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数

考点:虚函数 析构函数

14.说一下函数指针

15.说一下fork函数

16.C++中析构函数的作用

17.静态函数和虚函数的区别

18.说一说重载和覆盖

19.说一说strcpy和strlen

20.虚函数和多态

21.++i和i++的区别

22.++i和i++的实现

23.写个函数在main函数执行前先运行

24.有段代码写成了下边这样,如果在只修改一个字符的前提下,使代码输出20个hello?

1
for(int i = 0; i < 20; i--) cout << "hello" << endl;

25.智能指针shared_ptr的实现

26.以下四行代码的区别是什么?

1
2
3
4
const char * arr = "123";
char * brr = "123";
const char crr[] = "123";
char drr[] = "123";

27.C++里是怎么定义常量的?常量存放在内存的哪个位置?

28.const修饰成员函数的目的是什么

29.如果同时定义了两个函数,一个带const,一个不带,会有问题吗?

30.说一说隐式类型转换

31.说说你了解的类型转换

32.说一说C++函数栈空间的最大值

33.extern“C”

34.new/delete与malloc/free的区别是什么

35.说说你了解的RTTI

36.虚函数表具体是怎样实现运行时多态的?

37.说说C语言是怎么进行函数调用的?

38.C语言参数压栈顺序?

39.说说C++如何处理返回值?

40.malloc与new区别

41.C++中拷贝赋值函数的形参能否进行值传递?

42.说一说select

43.说说fork,wait,exec函数

44.静态函数和虚函数的区别

45.说一说重载和覆盖

46.说一说static关键字



类与数据抽象

1.C++中类成员的访问权限

2.说一下C++中struct和class的区别

3.回答一下C++类内可以定义引用数据成员



C++容器和算法

1.请你来说一下map和set有什么区别,分别又是怎么实现的?

2.介绍一下STL的allocaotr

3.说一说STL迭代器删除元素

4.STL中MAP数据存放形式

5.讲讲STL有什么基本组成

6.说说STL中map与unordered_map

7.说一说vector和list的区别,应用,越详细越好

8.说一下STL中迭代器的作用,有指针为何还要迭代器

9.说一说epoll原理

10.说一说STL迭代器是怎么删除元素的呢

11.说一说STL中MAP数据存放形式

12.n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)

13.回答一下STL里resize和reserve的区别

14.说一说stl里面set和map怎么实现的



面向对象与泛型编程

参考:https://www.jianshu.com/p/d19fc8447eaa
C++一共有三种基本值类型: 左值(lvalue), 纯右值(prvalue), 亡值(xvalue);
另外还有两种混合值类型: 泛左值(glvalue),右值(rvalue);
左值(lvalue)简单理解就是可以出现在=的左边,所以是可以被赋值的值;
右值(rvalue)类似理解是只可以出现在=的右边,所以是不可以被赋值的值;
左值(lvalue) = {泛左值(glvalue)} - {亡值(xvalue)};
右值(rvalue) = {亡值(xvalue)} ∪ {纯右值(prvalue)};
std::move的作用是返回一个亡值(xvalue);

1.回答一下什么是右值引用,跟左值又有什么区别?

2.什么情况下使用右值引用?



编译与底层

1.C++源文件从文本到可执行文件经历的过程?

2.回答一下include头文件的顺序以及双引号””和尖括号<>的区别?

3.回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?

4.说一说C++的内存管理是怎样的?

5.说一下C++/C的内存分配

6.回答一下如何判断内存泄漏?

7.说一下什么时候会发生段错误

8.回答一下什么是memory leak,也就是内存泄漏

9.回答一下new和malloc的区别

10.说一下共享内存相关api

11.说一下reactor模型组成

12.请自己设计一下如何采用单线程的方式处理高并发

13.说一说C++ STL 的内存优化

14.说说select,epoll的区别,原理,性能,限制都说一说

15.说说C++如何处理内存泄漏?



C++11

1.C++11有哪些新特性?

2.详细介绍一下C++11中的可变参数模板、右值引用和lambda这几个新特性。

参考:https://www.nowcoder.com/tutorial/93/3e889999205d447daad9ec50a6f85d85



DoubleGame实习生笔试

1.你有什么擅长的语言,并说说他们的优缺点。

C/C++
1.优点: C++实现了面向对象程序设计。在高级语言当中,处理运行速度是最快的,大部分的游戏软件,系统都是由C++来编写的。语言非常灵活,功能非常强大。如果说C语言的优点是指针,那么C++的优点就是性能和类层次结构的设计。非常严谨、精确和数理化,标准定义很细致。

2.缺点:语言的过度复杂和标准库的过度苍白,体系庞大,难点多:指针、STL、模板、boost……;难学。
(真的想吐槽一下,C/C++真的很复杂很难,但是为什么大学生,包括我自己,明明可能C/C++相关的项目经验都没有,甚至可能只是了解基础语法,就要在简历上写“精通C/C++”,??,但是如果按真实的来填写“了解C/C++”,投了简历,HR直接就说看了简历觉得不适合。完全大家都不能真实一点,算惹,还是自己太菜惹)

PHP
1.优点:语法简单,支持N种数据库,跨平台,性能优越;目前主流技术都支持,比如WebService、Ajax、XML等等,足够应用;有很多成熟的框架,并且很多都是开源的,使用成本很低。

2.缺点:对多线程支持不太好,语法不太严谨;PHP中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空,在语言级别上没有办法让某个对象常驻内存。

2.sql原生语句

(1).建立一个朋友通讯录表,要有姓名,电话,备注。

1
2
3
4
5
CREATE friend_table(
name int(11) not null ,
phone varchar(120) not null unique,
more varchar(120) not null
)

(2).插入一个朋友的联系方式(可能之前建立过)

1
2
3
INSERT INTO 
friend_table
values('小黑','123123122','black')

(3).查询某朋友的联系方式

1
2
3
SELECT * 
FROM friend_table
WHERE name='小猪'

3.排序,找前十个最大的数

随便写了个冒泡,然后写了个c++的sort(很sb……)
下来自己手撕了冒泡选择插入和快排。

1.冒泡

2.选择

3.插入

4.快排

5.归并

4.斐波那契数列

错了就是错了,不要找借口了。

S(1)=1;
S(N) -> N+S(N-1);
求S(100);

5.TCP和UDP协议区别

凉凉,可能没有比这更基础的,忘记复习,只答上了俩点

6.设计一个算法实现抽奖

宝箱 A B C D
价值 100 150 200 250

设rand()是随机1到1000的数,宝箱概率和价值要成反比,设计一个算法实现宝箱抽奖。