面经
字节一面面经(9.6 1h)
自我介绍,介绍项目经验,哪些比较亮点,觉得自己做的比较好的点,或者遇到难解决的问题以及怎么解决的?
技术知识:
1、硕士课程有哪些?
2、熟悉的语言有哪些?
3、C++11的新特性有哪些?
4、虚函数和纯虚函数的区别是什么?
5、C语言里extern关键字
6、extern本质是什么?编译阶段生成的符号效果是什么?
7、静态链接和动态链接的区别?
8、面向对象编程有哪些常见的概念?具体是怎么用的?
9、多态是什么意思?
10、C语言里怎么判断当前运行环境是32位还是63位?
11、线程和进程的区别?
12、C语言函数调用的过程,函数的栈帧是怎么变化的?栈顶到栈底是怎么样的结构?
##编程:
1、拷贝构造函数、移动构造函数
2、给一个IP地址是否符合IPV4的标准
C11新特性
- 空指针nullptr:传统C++会把NULL和0看成一样的,导致重载特性发生混乱(void func(int);和void func(char*))。
- Lambda表达式:类似匿名函数的特性,产生的是函数对象,在类中可以重载 函数调用运算符() ,此时类的对象具有类似函数的行为,称这些对象为函数对象(Function Objector)或仿函数(Functor)。每次定义一个仿函数都要定义一个类,Lambda可以看成对仿函数的简化。
- 右值引用:C++03及之前的标准中右值不允许被改变(如:
a = b; a = fun()
中b和fun()的返回的临时变量不能在执行时被修改,需要重新构造左值再析构右值),C++11的右值引用特性允许我们对右值进行修改,借此可以试下move语义,如移动构造函数、移动赋值运算符。 - 泛化的常量表达式 constexpr
- 初始化列表:initializer_list接受变长的对象初始化列表
class A{ public: A(std::initializer_list<int> list); }; A a = {1, 2, 3};
- 统一的初始化语法:
{}
X x1 = X{1,2}; X x2 = {1,2}; X x3{1,2}; X *p = new X{1,2}; struct D : X { D(int x, int y) : X{x, y}{ ... }; }
- (静态)类型推导:知道类型没问题,但又不想完整写出类型时
- auto
- decltype:获取表达式的类型,而不对表达式求值
8.基于范围的for循环:
for (dataType rangeVariable : array){...}
- dateType:范围变量的数据类型。与数组元素的类型一样。
- rangeVariable:范围变量名称。
9.构造函数委托:构造函数可以调用另一个构造函数,实现代码复用,简化代码。
10.final和override:用final来禁止虚函数被重写/禁止类被继承,override用来显式地重写虚函数。
11.default和delete:编译器会为类自动生成一些方法(例如构造和析构)。default和delete可以显示的指定和禁止这些自动行为。
struct classA{ classA() = default; //声明一个自动生成的函数 void *operator new(size_t) = delete; //禁止生成new运算符 };
12.静态assertion
13.智能指针:new的内存必须显式使用delete释放,如果忘记容易导致内存泄露。因此将指针封装进类,则会随着对象生命周期的结束调用析构函数来自动释放内存。智能指针的 本质 就是封装了指针的类(是一个栈对象)。std::auto_ptr可用来管理 单个 对象的内存,=会使右值失去所有权;release()不会释放对象,仅仅是归还所有权;不能用来管理堆内存数组。
14.正则表达式
15.增强元祖
16.哈希表: map, multimap, set, multiset
使用红黑树实现插入和查询都是O(lgn)的复杂度,C++11提供了底层哈希的实现,可以达到O(1)的复杂度。
虚函数和纯续函数的区别
- 纯虚函数:在基类中只有声明没有定义。虚函数声明后加
=0
,拥有纯虚函数的类称为抽象类。虚函数:在基类中有完整的定义。 - 纯虚函数必须被子类实现才可以使用,是为了实现一个接口,起到规范作用。虚函数可以直接调用也可以被子类重载。
- 虚函数时用于实现多态的机制,通过基类访问派生类定义的函数。
- 抽象类 不能实例化对象,只能作为基类被继承。(可用于实例化对象的类称为 具体类 )
多态
- 多态性是指相同对象收到不同消息或者不同对象收到相同消息时产生不同的实现动作。
- 编译时多态性:通过重载函数实现
- 运行时多态性:通过虚函数实现
- 有序列表内容
绑定
- 对象的静态类型:声明时的类型。在编译期确定。不可更改。
- 对象的动态类型:所指向对象的烈性。运行期确定。可更改。
- 静态绑定:绑定的是对象的静态类型。发生在编译期。(缺省参数静态绑定)
- 动态绑定:绑定的是对象的动态类型。发生在运行期。(虚函数动态绑定)
虚函数动态绑定的实现原理
- 动态选择被执行的函数
- 函数的调用,需要通过函数代码的入口地址
- 把函数入口地址作为变量,不同情况下赋予不同的值,再通过该变量调用函数
- 虚表
- 每个多态类有一个虚表,
- 虚表中有当前类的各个虚函数的入口地址
- 每个对象有一个指向当前类的虚表的指针(虚指针vptr)
- 动态绑定的实现
- 构造函数中为对象的虚指针赋值
- 通过多态类型的指针或引用调用成员函数时,通过虚指针找到虚表,再找到所调用虚函数的入口地址
- 通过入口地址调用虚函数
面向对象编程的概念
- 对象
- 属性:描述对象静态特征的数据项。
- 行为:描述对象动态特征的操作序列。
- 类
- 具有相同属性和服务的一组对象的集合。
- 为属于该类的全部对象提供了抽象的描述,包括属性和行为。
- 一个属于某类的对象称为该类的一个实例。
- 封装
- 把对象的属性和服务结合成一个独立的系统单元。
- 隐蔽对象内部细节,只保留有限的外部接口使之与外部发生联系。
- 继承
- 定义:特殊类的对象拥有一般类的全部属性与服务,称作特殊类对一般类的继承。
- 继承对软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。
- 多态性
- 一般类中定义的属性或行为,被特殊类继承后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类和特殊类中具有不同的语义。