c++一些面试题
2020-03-02 本文已影响0人
Dakini_Wind
- c++三大特性
- 封装
封装可以隐藏实现细节,使得代码模块化;封装是把成员变量和成员函数封装起来,对成员变量的访问只能通过成员函数。c++类中不要留有public 成员变量,应当在设计时提供一组读写其的成员函数。C#,java中都是使用属性代替了public 成员变量。 - 继承(实现继承、接口继承和可视继承)
- 实现继承是指使用基类的成员变量和成员函数而无需额外编码的能力;(注:private修饰的部分也会被继承,只是使用不了)
- 接口继承是指仅使用成员变量和成员函数的名称、但是子类必须提供实现的能力
- 可视继承是指子窗体(类)使用基窗体(类)的外观和实现代码的能力
- 多态
- 静态多态(编译阶段)
- 函数重载
- 泛型编程
- 动态多态(运行阶段)
- 虚函数
- 静态多态(编译阶段)
- 封装
- 拷贝构造函数
- 相同类型的类对象是通过拷贝构造函数来完成整个复制过程的
- 拷贝构造函数的调用时机:
对象以值传递的方式传入函数参数
对象以值传递的方式从函数返回
对象需要通过另外一个对象进行初始化 - 浅拷贝和深拷贝
默认拷贝构造函数默认生成,为浅拷贝
浅拷贝和深拷贝的区别在于:浅拷贝没有处理静态数据和动态成员
- 拷贝构造函数和=赋值的区别(同上)
- c++中struct、class区别
- 默认继承权限:struct -> public, class -> private
- 成员的默认访问权限:
- c11新特性
- 基于范围的for循环:for(int x : nums);
- 自动推断类型:auto func = [](int i){ return i+4};
- 后置返回类型:
template <typename T, typename U>
auto add(T t, U u) -> decltype(t + u)
{
return t + u;
} - 显示重写(覆盖)override和final
override:用一个虚函数覆盖另一个虚函数
final:防止继承和子类重写 - 空指针常量nullptr
出现原因:0 具有int和NULL双重身份
void foo(int n);
void foo(char* cArr); - long long int
出现原因:long int 在某些实现中是32位,为了保证64位出现 - sizeof
变化:可以不通过对象,直接使用作用域运算符来获取成员的大小 - 线程支持
- 元组
- 其它新增标准程序库
正则化表达式库<regex>;字符串类<string>字新增与其他类型互换的方法,如to_string(),stoi(),stol等;STL标准模板库新增unordered_map以及unordered_set,基于hash表的关联容器等等。
- 虚函数
c++中使用关键字virtual让函数成为虚函数,派生类中对此函数的不同实现都会继承这一修饰符,允许后续派生类覆盖,达到迟绑定的效果。
在Java语言中, 所有的方法默认都是"虚函数". 只有以关键字 final 标记的方法才是非虚函数. - 纯虚函数
实现:在虚函数后面加“=0”
作用:规范作用,使派生类仅仅只是继承函数的接口。用户不能创建类的实例,只能创建它的派生类的实例。 纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。 - 代码重用角度,说下虚函数和模板有什么区别,分别适用于什么
模板是静态的技术,在编译期决定;虚函数更侧重于运行期,适合描述动态的行为;
虚函数通过间接层增加编译器防火墙;模板取消间接层增加效率。
模板有自己的使用,范围 一般来说在下面的情况下 ,适合于使用模板而不是虚函数:
(1)当该文的程序使用了对象本身的集合而不是对象指针的集合,而这些对象的行为表现出共同性的时候,可考虑使用模板多态
(2)如果该文的算法或者构件表现出共同的行为,而这些行为是可以在编译期决定可以考虑使用模板多态
(3)如果该文的代码需要表现出某种策略的选择,这种策略依赖于客户端代码的编译前配置 ;而如果不考虑这些策略,代码表现出很大的共同性,在这种情况下可以考虑使用模板多态
(4)该文的程序对效率要求很高的情况下可考虑使用模板多态 - 什么设计模式可以避免内存泄露?
内存池模式(算设计模式吗)、享元模式 - 数据库的乐观锁和悲观锁是什么?
- 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
在查询完数据的时候就把事务锁起来,直到提交事务
实现方式:使用数据库中的锁机制 - 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。
在修改数据的时候把事务锁起来,通过version的方式来进行锁定
实现方式:使用version版本或者时间戳
- 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作