C++面试总结(一)—基本概念
目录一、内存管理2. 深拷贝与浅拷贝3. 几种内存分配方式二、面向对象核心1. class 与 struct 的区别2. 面向对象的三个基本特征3. 重载、重写与隐藏4. 多态的实现方法5. 空类默认生成的成员函数三、关键字与修饰符1. static 的三种用法2. const 的用法辨析3. volatile 关键字四、指针与引用1. 引用与指针的区别2. 使用引用的注意事项五、高级特性1. 虚函数与内联函数2. 只能用初始化列表的情况六、进程与线程1. 进程间通信方式2. 死锁相关3. Windows 线程同步方式七、C 容器1. 容器分类八、Windows 编程基础1. 应用程序类型2. 窗口程序创建流程3. 消息机制核心九、其他重要概念1. 结构体与联合体的区别2. 数组与链表的区别3. 全局变量相关4. 断言 assert5. main 函数之前执行的代码6. C 与 C 的区别十、拷贝构造函数调用时机一、内存管理1. new/delete 与 malloc/free 的区别与联系核心要点(1)new在分配内存后会调用构造函数delete在释放前会调用析构函数(2)malloc/free是库函数不在编译器控制权限内无法强制调用构造/析构(3) C 程序中new/delete底层实现也会调用malloc/free(4)delete只会调用一次析构函数delete[]会调用每个成员的析构函数2. 深拷贝与浅拷贝类型定义特点浅拷贝源对象与拷贝对象共用一份实体仅引用变量不同任一对象改动都会影响另一个深拷贝源对象与拷贝对象互相独立任一对象改动不会影响另一个通俗理解 浅拷贝复制指针深拷贝复制对象本身。3. 几种内存分配方式二、面向对象核心1. class 与 struct 的区别C 中的区别(1)默认继承权限class为private继承struct为public继承(2)默认成员访问权限class成员默认privatestruct成员默认publicC 与 C 的区别C 中的struct可以定义方法C 中的struct不可以2. 面向对象的三个基本特征多态的作用(1) 隐藏实现细节代码模块化实现代码重用(2) 接口重用保证继承体系中任一类实例属性的正确调用3. 重载、重写与隐藏4. 多态的实现方法(1) 基类引用指向派生类实例(2) 基类指针指向派生类实例5. 空类默认生成的成员函数class Empty { public: Empty(); // 缺省构造函数 Empty(const Empty); // 拷贝构造函数 ~Empty(); // 析构函数 Empty operator(const Empty); // 赋值运算符 Empty* operator(); // 取值运算符 const Empty* operator() const; // 取值运算符 const };三、关键字与修饰符1. static 的三种用法2. const 的用法辨析const vs #define 的优点(1)const有数据类型编译器可进行类型安全检查(2) 集成化调试工具可对const进行调试不能对宏调试3. volatile 关键字含义告诉编译器该变量可能被意想不到地改变优化器每次必须重新读取该值而非使用寄存器备份。应用场景(1) 并行设备的硬件寄存器如状态寄存器(2) 中断服务子程序访问的非自动变量(3) 多线程应用中被多个任务共享的变量四、指针与引用1. 引用与指针的区别作为函数参数的区别(1) 引用是实参的别名不产生副本直接操作实参(2) 指针需要给形参分配存储单元可读性较差(3) 传递大数据时引用效率和空间占用更优2. 使用引用的注意事项(1) 声明时必须初始化(2) 不能声明为两个变量的别名(3) 不能建立数组的引用(4) 不能返回局部变量的引用即使局部变量是静态的(5) 不能返回函数内部new分配的内存的引用五、高级特性1. 虚函数与内联函数2. 只能用初始化列表的情况当类中含有以下成员时必须使用初始化列表(1)const成员变量(2) 引用成员变量(3) 基类的构造函数六、进程与线程1. 进程间通信方式(1) 共享内存(2) 管道有名管道/无名管道(3) Socket(4) 消息队列(5) 信号(6) 信号量(7) 内存映射2. 死锁相关死锁原因资源竞争及进程推进顺序非法四个必要条件(1) 互斥(2) 请求保持(3) 不可剥夺(4) 环路3. Windows 线程同步方式(1) 原子锁(2) 临界区段(3) 事件(4) 互斥体(5) 信号量(6) 可等候定时器七、C 容器1. 容器分类顺序容器特性(1)vector连续存储支持快速随机访问(2)list非连续存储支持中间快速插入删除(3)deque双端队列具有后进先出特性容器适配器stack栈、queue队列、priority_queue优先队列八、Windows 编程基础1. 应用程序类型(1) 控制台程序(2) 窗口程序(3) 库程序静态/动态2. 窗口程序创建流程定义WinMain入口函数定义窗口处理函数WindowProc注册窗口类RegisterClass创建窗口CreateWindow显示窗口ShowWindow/UpdateWindow消息循环GetMessage→TranslateMessage→DispatchMessage消息处理3. 消息机制核心执行机制事件驱动消息机制关键函数GetMessage获取消息TranslateMessage翻译消息按键转字符DispatchMessage派发消息到窗口处理函数SendMessage vs PostMessagePostMessage将消息加入队列不等处理立即返回SendMessage等待消息处理完毕后才返回九、其他重要概念1. 结构体与联合体的区别2. 数组与链表的区别3. 全局变量相关局部变量与全局变量重名能局部会屏蔽全局使用::访问全局变量引用已定义的全局变量(1) 引用头文件方式编译期报错写错变量名(2)extern关键字链接期报错写错变量名全局变量定义在头文件中可以在不同 C 文件中以static形式声明同名变量且只能有一个文件赋初值4. 断言 assert仅在 Debug 版本起作用的宏用于检查不应该发生的情况是安全无害的测试手段5. main 函数之前执行的代码全局对象的构造函数会在main函数之前执行。6. C 与 C 的区别十、拷贝构造函数调用时机以下情况会调用拷贝构造函数(1) 对象以值传递方式传入函数体(2) 对象以值传递方式从函数返回(3) 对象需要通过另一个对象进行初始化