QA

1. .h和.cpp区别

.h:头文件,里面不写代码,只包含公共的函数声明等(类的定义包含变量和函数的声明),方便其他程序include,类的定义可以放在头文件中
.cpp:源文件,存放代码逻辑

2. include “”和<>区别

简言之 #include <> 和 #include “” 都会在实现定义的位置查找文件,并将其包含。
区别是若 #include “” 查找成功,则遮蔽 #include <> 所能找到的同名文件;否则再按照 #include <> 的方式查找文件。另外标准库头文件都放在 #include <> 所查找的位置。
一般来说 #include <> 的查找位置是标准库头文件所在目录, #include “” 的查找位置是当前源文件所在目录。不过这些都可由编译器调用参数等配置更改。
https://www.runoob.com/w3cnote/cpp-header.html

3. C和C++区别

C是面向过程的语言,而C++是面向对象的语言
计算机语言可以归为面向过程语言和面向对象语言,那么到底什么是面向对象,什么是面向过程呢?

面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

可以拿生活中的实例来理解面向过程与面向对象,例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用不同的方法来实现。

如果是面向对象的设计思想来解决问题。面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。

可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了多个步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
[

](https://blog.csdn.net/csdn_baotai/article/details/79718957)
面向过程:
概念:面向过程是一种以过程为中心的 编程思想,它是一种基础的顺序的思维方式,面向对象方法的基础实现中也包含面向过程思想。
特性:模块化 流程化
优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、 Linux/Unix等一般 采用面向过程开 发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展

面向对象:
概念 :面向对象是按人们认识客观世界的 系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
特性:抽象 封装 继承 多态
优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护


4. 内存相关

(https://zhuanlan.zhihu.com/p/344377490)
截屏2022-01-05 下午9.03.51.png
C中,内存分为5个区:

  1. Code Segment(代码区)

也称Text Segment,存放可执行程序的机器码。

  1. Data Segment (数据区)

存放已初始化的全局和静态变量, 常量数据(如字符串常量)。

  1. BSS(Block started by symbol)

存放未初始化的全局和静态变量。(默认设为0)

  1. Heap(堆)

从低地址向高地址增长。容量大于栈,程序中动态分配的内存在此区域。

  1. Stack(栈)

从高地址向低地址增长。由编译器自动管理分配。程序中的局部变量、函数参数值、返回变量等存在此区域。
(此外,C++中有自由存储区(new)一说,见下面。全局变量、static变量会初始化为缺省值,而堆和栈上的变量是随机的,不确定的。)

另一种,其实本质都一样:

  1. 栈区(stack) 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
  2. 堆区(heap) 就是那些由 new 分配的内存块,一般一个 new 就要对应一个 delete。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链。堆可以动态地扩展和收缩。
  3. 自由存储区 就是那些由 malloc 等分配的内存块,他和堆是十分相似的,不过它是用 free 来结束自己的生命的。
  4. 全局区(静态区)(static)全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域data段, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域bss段。程序结束后有系统释放
  5. 常量存储区 存放的是常量,不允许修改。常量字符串就是放在这里的。常量字符串不能修改, 否则程序会在运行期崩溃(当然,你要通过非正当手段也可以修改,而且方法很多).程序结束后由系统释放
  6. 程序代码区 存放函数体的二进制代码。

搭配示例:

  1. int a=0; 全局初始化区
  2. char *p1; 全局未初始化区
  3. int main()
  4. {
  5. int b; //栈
  6. char s[]="abc"; //栈
  7. char *p2; //栈
  8. char *p3="123456"; //123456/0在常量区,p3在栈上。
  9. static int c =0//全局(静态)初始化区
  10. p1 = (char *)malloc(10); //分配得来得10和20字节的区域就在堆区
  11. p2 = (char *)malloc(20);
  12. strcpy(p3,"123456"); //123456/0放在常量区,编译器可能会将它与p3所指向的"123456" 优化成一个地方。
  13. }

此外,C++中有自由存储区(new)一说。全局变量、static变量会初始化为缺省值,而堆和栈上的变量是随机的,不确定的。

堆栈区别

5.