C++面试题总结,一篇就够了

C++面试题汇总

  • 1. C基础
    • 1.1 内存模型
      • 1.1.0 内存四区
      • 1.1.1 简述C、C++程序编译的内存分配情况
      • 1.1.2 分配函数与释放函数
        • 1.1.2.1 malloc / free
        • 1.1.2.2 new / delete
        • 1.1.2.3 new/delete 与 malloc/free 区别
        • 1.1.2.5 calloc 、realloc
        • 1.1.2.6 在C++中,使用malloc申请的内存能否通过delete释放?使用new申请的内存能否用free?
    • 1.2 预编译
      • 1.2.1 头文件问题
      • 1.2.2 const 与 #define相比有什么优点
    • 1.3 宏,内联函数
      • 1.3.1 内联函数
      • 1.3.2 内联函数与宏的差别
      • 1.3.3 写一个 “标准”宏MIN
      • 1.3.4 typedef 和define 有什么区别
    • 1.4 指针
      • 1.4.1 指针常量和常量指针
      • 1.4.2 指针函数和函数指针
      • 1.4.3 指针数组数组指针
      • 1.4.4 函数传参
      • 1.4.5 一些定义
      • 1.4.6 指针与引用的区别
      • 1.4.7 this指针
      • 1.4.8 指针和句柄
      • 1.4.9 如何避免“野指针”
      • 1.4.10 空指针与迷途指针区别
    • 1.5 const
      • 1.5.1 const 使用
      • 1.5.2 const 作用
      • 1.5.3 如何修改const成员函数
      • 1.5.4 将Const类型转化为非Const类型
    • 1.6 sizeof
      • 1.6.1 sizeof 和strlen 的区别
      • 1.6.2 sizeof 的使用场合
    • 1.7 强制类型转换运算符
    • 1.8 什么是右值引用,跟左值又有什么区别?
      • 1.9 变量的声明和定义有什么区别
      • 1.10 说一说extern“C”
  • 2. C++面向对象
    • 2.1 面对对象的三大特性(基本特征)
    • 2.2 封装
    • 2.3 继承
    • 2.4 多态
    • 2.5 成员函数
      • 2.5.1 构造函数与析构函数
      • 2.5.2 初始化列表方式
      • 2.5.3 构造函数调用方式
      • 2.5.4 C++的空类默认产生哪些成员函数
      • 2.5.5 继承中子类和父类的构造和析构顺序
      • 2.5.6 深拷贝与浅拷贝
      • 2.5.6 拷贝构造函数与赋值运算符
      • 2.5.7 C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
      • 2.5.8 静态成员
      • 2.5.9 常函数与常对象
    • 2.6 引用
      • 2.6.1 引用
      • 2.6.2 常引用
      • 2.6.3 引用与指针区别
    • 2.7 虚函数
      • 2.7.1 虚函数与纯虚函数
      • 2.7.2 抽象类
      • 2.7.3 虚析构与纯虚析构
      • 2.7.4 多态类中的虚函数表是compile-Time建立的还是Run-Time建立的
      • 2.7.5 析构函数可为virtual型,构造函数不能,为什么?
      • 2.7.6 能否把每个函数都声明为虚函数?
    • 2.8 隐藏、重载与重写
    • 2.9 class 与struct 区别
    • 2.10 友元
  • 3. STL
    • 3.1 vector的底层原理
    • 3.2 vector中的reserve和resize的区别
    • 3.3 vector中的size和capacity的区别
    • 3.4 vector中erase方法与algorithn中的remove方法区别
    • 3.5 vector迭代器失效的情况
    • 3.6 正确释放vector的内存(clear(), swap(), shrink_to_fit())
    • 3.7 list的底层原理
    • 3.8 什么情况下用vector,什么情况下用list,什么情况下用deque
    • 3.9 priority_queue的底层原理
    • 3.10 map 、set、multiset、multimap的底层原理
    • 3.11 为何map和set的插入删除效率比其他序列容器高
    • 3.12 为何map和set每次Insert之后,以前保存的iterator不会失效?
    • 3.13 当数据元素增多时(从10000到20000),map的set的查找速度会怎样变化?
    • 3.14 map 、set、multiset、multimap的特点
    • 3.15 为何map和set的插入删除效率比其他序列容器高,而且每次insert之后,以前保存的iterator不会失效?
    • 3.16 为何map和set不能像vector一样有个reserve函数来预分配数据?
    • 3.17 set的底层实现实现为什么不用哈希表而使用红黑树?
    • 3.18 hash_map与map的区别?什么时候用hash_map,什么时候用map?
    • 3.19 迭代器失效的问题
    • 3.20 STL线程不安全的情况
  • 4. C++ 11
    • 4.1 NULL与nullptr
      • 4.1.1 C语言中的NULL
      • 4.1.2 C++中的NULL
      • 4.1.3 C++中的nullptr
    • 4.2 智能指针

C++知识点总结: 快速跳转

1. C基础

1.1 内存模型

1.1.0 内存四区

意义在于:赋予其不同的生命周期,给编程带来更大的灵活性

  • 运行前
    • 代码区:存放函数体的二进制代码,由操作系统管理
      • 共享的
      • 只读的:防止程序意外修改其指令
    • 全局区:存放全局变量和静态变量以及常量,结束后由系统释放
      • 全局区还包括常量区(字符串常量,const修饰的全局常量)
  • 运行后
    • 栈区:由编译器自动分配和释放,存放函数体的参数值、局部变量
      • 不能返回局部变量的地址,当离开作用域后,开辟在栈区的局部变量会被编译器自动回收
    • 堆区:由程序员分配和释放,若不释放,程序结束后由操作系统释放
      • 分全局堆和局部堆
      • 全局堆就是所有没有分配的空间,局部堆就是用户分配的空间
      • 堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆

1.1.1 简述C、C++程序编译的内存分配情况

  • 从静态存储区域分配
    内存在程序 编译 时 就已 经 分配 好,这块内 存在 程序 的整 个运行 期间 都存在 。速 度快、不容易出错 , 因 为 有系 统 会善 后。例 如全 局变 量, sta tic 变量, 常量 字符 串等。
  • 在栈上分配
    在执行函数时, 函数内局部变量的存储单元都在栈上创建,函数执行结束时这些存储单元自动被释放。 栈内存分配运算内置于处理器的指令集中, 效率很高, 但是 分配的内存容量有限 。大小为2M。
  • 从堆上分配
    即动态内存分配。程序在运行的时候用 malloc 或 new 申请任意大小的内存,程序员自己负责在何时用 free 或delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活。如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏 ,另外频繁地分配和释放不同大小的堆空间将会产生堆内碎块 。

一个C、C++ 程序****编译时内存分为5大存储区:堆区、栈区、全局区、文字常量区、程序代码区

1.1.2 分配函数与释放函数

  • C:malloc、calloc、realloc / free
  • C++:new / delete
1.1.2.1 malloc / free

大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息——分配块的长度,指向下一个分配块的指针等等

  • malloc函数向内存申请一块连续可用的空间
  • 开辟成功则返回一个指向该空间的void* 型指针,所以需要对其进行强制类型转换,转换成我们想要的类型
  • 开辟失败则返回 NULL,所以一定要对malloc的返回值进行检查
  • free 用来释放动态开辟的内存,而不是释放指针
int* ptr = NULL;
ptr = (int*

你可能感兴趣的:(C++学习笔记,c++,面试)