cpp基础

C++常见面试问题汇总

  • 指针和引用的区别

指针是一个变量,引用不过是别名;指针可以多级;指针可空,引用不可空且定义时必须初始化

  • 堆和栈的区别

堆存放用户自定义的;栈存放函数信息;

  • new和delete是如何实现的,new 与 malloc的异同处

new和delete是cpp操作符,malloc库函数;new可以调构造函数,自动计算对象大小;

  • C和C++的区别
  • C++、Java的联系与区别,包括语言特性、垃圾回收、应用场景等(java的垃圾回收机制)
  • Struct和class的区别

class 是引用类型,它在堆中分配空间;而struct 是值类型,它在栈中分配空间。

class默认private,struct默认public,保留是因为向下兼容。

  • define 和const的区别(编译阶段、安全性、内存占用等)
  • 在C++中const和static的用法(定义,用途)

static局部变量,函数,全局变量,persistent&private,存放在数据区,函数仅当前文件可用。

  • const和static在类中使用的注意事项(定义、初始化和使用)
  • C++中的const类成员函数(用法和意义),以及和非const成员函数的区别
  • C++的顶层const和底层const
  • final和override关键字
  • 拷贝初始化和直接初始化,初始化和赋值的区别
  • extern “C”的用法
  • 模板函数和模板类的特例化
  • C++的STL源码(这个系列也很重要,建议侯捷老师的STL源码剖析书籍与视频),其中包括内存池机制,各种容器的底层实现机制,算法的实现原理等)
  • STL源码中的hashtable的实现
  • STL中unordered_map和map的区别和应用场景
  • STL中vector的实现
  • STL容器的几种迭代器以及对应的容器(输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机访问迭代器)

顺序容器:vector,deque是随机访问迭代器;list是双向迭代器

容器适配器:stack,queue,priority_queue没有迭代器

关联容器:set,map,multiset,multimap是双向迭代器

unordered_set,unordered_map,unordered_multiset,unordered_multimap是前向迭代器

  • STL中的traits技法

type_traits

iterator_traits

char traits

allocator_traits

pointer_traits

array_traits

  • vector使用的注意点及其原因,频繁对vector调用push_back()对性能的影响和原因。
  • C++中的重载和重写的区别
  • C++内存管理,内存池技术(热门问题),与csapp中几种内存分配方式对比学习加深理解
  • 介绍面向对象的三大特性,并且举例说明每一个
  • C++多态的实现
  • C++虚函数相关(虚函数表,虚函数指针),虚函数的实现原理(包括单一继承,多重继承等)(拓展问题:为什么基类指针指向派生类对象时可以调用派生类成员函数,基类的虚函数存放在内存的什么区,虚函数表指针vptr的初始化时间)
  • C++中类的数据成员和成员函数内存分布情况
  • this指针
  • 析构函数一般写成虚函数的原因
  • 构造函数、拷贝构造函数和赋值操作符的区别

构造函数:对象不存在,没用别的对象初始化

拷贝构造函数:对象不存在,用别的对象初始化

赋值运算符:对象存在,用别的对象给它赋值

  • 构造函数声明为explicit
  • 构造函数为什么一般不定义为虚函数
  • 构造函数的几种关键字(default delete 0)

= default:将拷贝控制成员定义为=default显式要求编译器生成合成的版本

= delete:将拷贝构造函数和拷贝赋值运算符定义删除的函数,阻止拷贝(析构函数不能是删除的函数 C++Primer P450)

= 0:将虚函数定义为纯虚函数(纯虚函数无需定义,= 0只能出现在类内部虚函数的声明语句处;当然,也可以为纯虚函数提供定义,不过函数体必须定义在类的外部)

  • 构造函数或者析构函数中调用虚函数会怎样
  • 纯虚函数
  • 静态类型和动态类型,静态绑定和动态绑定的介绍
  • 引用是否能实现动态绑定,为什么引用可以实现
  • 深拷贝和浅拷贝的区别(举例说明深拷贝的安全性)
  • 对象复用的了解,零拷贝的了解
  • 介绍C++所有的构造函数
  • 什么情况下会调用拷贝构造函数(三种情况)
  • 结构体内存对齐方式和为什么要进行内存对齐?
  • 内存泄露的定义,如何检测与避免?
  • 手写智能指针的实现(shared_ptr和weak_ptr实现的区别)
  • 智能指针的循环引用
  • 遇到coredump要怎么调试
  • 内存检查工具的了解
  • 模板的用法与适用场景
  • 成员初始化列表的概念,为什么用成员初始化列表会快一些(性能优势)?
  • 用过C++ 11吗,知道C++ 11哪些新特性?
  • C++的调用惯例(简单一点C++函数调用的压栈过程)
  • C++的四种强制转换

static_cast

dynamic_cast

const_cast

reinterpret_cast

  • C++中将临时变量作为返回值的时候的处理过程(栈上的内存分配、拷贝过程)
  • C++的异常处理
  • volatile关键字
  • 优化程序的几种方法
  • public,protected和private访问权限和继承
  • class和struct的区别
  • decltype()和auto
  • inline和宏定义的区别
  • C++和C的类型安全