👉 八股:

1、请简单描述一下C语言和C++的区别

2、简单概述一下C++的特点(三大特性)

3、C++从源码到可执行文件有哪几步?

4、说一说动态链接和静态链接的区别。

5、include中双引号“”和尖括号<>的区别

6、类构造函数调用问题

7、怎么在C++中调用已经被C编译器编译后的函数?

8、介绍一下什么是C++的宏

9、C++为什么提倡尽量避免使用宏定义

10、C++中应该怎么办才能替代 #define 的一些功能

11、简单介绍一下 const 和 # define 的区别

12、简单介绍一下const的各种应用

13、简单介绍一下# define 和 inline 的区别

👉 代码:

八股内容:C++基础 ①


1、请简单描述一下C语言和C++的区别

  • C++可以很好的兼容C语言,但同时也有很多新的特性(C++11新特性)

  • 首先要说的区别:

    • C语言是面向过程的编程语言。

    • C++是面向对象的编程语言,C++引入了,因此产生了三大特性:封装、继承、多态。

  • C语言和C++中都有结构这一概念。

    • 但是在 C语言 中,结构只包含成员变量,没有成员方法,且成员变量是公共的,不管什么人都可以去访问;

    • C++ 的结构则可以同时拥有成员函数和成员变量,且默认访问权限是私有;

      • C++中struct 的默认访问权限也是public
  • 设计思路区别:

    • C语言是一门结构化语言,在设计的时候我们首先要考虑的是怎样通过一个过程对输入进行处理的到输出,C语言广泛用于底层开发。

    • 而进行C++编程,我们首先要考虑的是如何构造一个对象模型,让这个模型能够契合对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。

  • 图像处理方面的区别:

    • C++中的图形处理和C语言的图形处理有很大的区别。C语言中的图形处理函数基本上是不能用在中C++中的。C语言标准中不包括图形处理。
  • 安全方面:

    • C语言指针使用的潜在危险性、强制转换的不确定性、内存泄漏问题等,都会带来安全方面的问题。

    • 对此,C++引入了 const常量、引用、cast转换机制、智能指针、try-catch语法等。

  • 可复用性:

    • C++引入了模板的概念并再次基础上实现了STL(标准模板库)。STL的重要特点之一就是以泛型化编程的思想实现了算法与数据结构的分离,

2、简单概述一下C++的特点(三大特性)

  • C++在C语言的基础上引入了面向对象的机制,C++支持数据封装支持数据封装就是支持数据抽象。在C++中,类是支持数据封装的工具,对象则是数据封装的实现。面向过程的程序设计方法与面向对象的程序设计方法在对待数据和函数关系上是不同的。C++同时兼容C语言。

  • C++有三大特性,分别是封装、继承、多态。(面试官就等着你说这个呢);

    • 多态:C++允许函数名和运算符重载;C++支持多态性,C++允许一个相同的标识符或运算符代表多个不同实现的函数,这就称标识符或运算符的重载,用户可以根据需要定义标识符重载或运算符重载。

    • C++中可以允许单继承和多继承。一个类可以根据需要生成派生类。派生类继承了基类的所有方法,另外派生类自身还可以定义所需要的不包含在父类中的新方法。一个子类的每个对象包含有从父类那里继承来的数据成员以及自己所特有的数据成员。

  • C++因为其结构清醒的特点,可读性好,也便于扩充;

  • C++可以定义不同的访问控制权限,类内分 私有、公有、保护;

  • C++生成的代码质量高,运行效率高,仅比汇编语言慢10%~20%;

  • C++更加安全,增加了const常量、引用、四类cast转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)、智能指针、try—catch等等;

  • 可复用性高:C++引入了模板的概念并再次基础上实现了STL(标准模板库)。STL的重要特点之一就是以泛型化编程的思想实现了算法与数据结构的分离,


3、C++从源码到可执行文件有哪几步?

  • 一共有四个过程预编译编译汇编链接

alt

  • 预处理: 产生.ii文件;主要的处理操作如下:

    • 对全部的#define进行宏展开。

    • 处理全部的条件编译指令,比方#if#ifdef#elif#else#endif;

    • 处理 #include 指令,这个过程是递归的,也就是说被包括的文件可能还包括其它文件;

    • 删除全部的注释 ///**/

    • 加入行号和文件标识

    • 保留全部的 #pragma 编译器指令

ps:经过预处理后的.ii文件不包括不论什么宏定义,由于全部的宏已经被展开。而且包括的文件也已经被插入到.ii文件里。

  • 编译:产生汇编文件(.s文件)
    • 词法分析:将源代码的字符序列分割成一系列的记号。

    • 语法分析:对记号进行语法分析,产生语法树。

    • 语义分析:判断表达式是否有意义。

    • 代码优化:

    • 目标代码生成:生成汇编代码。

    • 目标代码优化:

编译会将源代码由文本形式转换成机器语言,编译过程就是把预处理完的文件进行一系列词法分析、语法分析、语义分析以及优化后生成相应的汇编代码文件。

编译后的.s是ASCII码文件。

  • 汇编:产生目标文件(.o或.obj文件)

    • 汇编过程调用汇编器AS来完成,是用于将汇编代码转换成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。

汇编后的.o文件是纯二进制文件。

  • 链接:产生可运行文件(.out或.exe文件)

    • 链接是将所有的.o文件和库(动态库、静态库)链接在一起,得到可以运行的可执行文件(Windows的.exe文件或Linux的.out文件)等。它的工作就是把一些指令对其他符号地址的引用加以修正。链接过程主要包括了地址和空间分配、符号决议和重定向。

最基本的链接叫做静态链接,就是将每个模块的源代码文件编译、汇编成目标文件(Linux:.o 文件;Windows:.obj文件),然后将目标文件和库一起链接形成最后的可执行文件(.exe或.out等)。库其实就是一组目标文件的包,就是一些最常用的代码变异成目标文件后打包存放。最常见的库就是运行时库,它是支持程序运行的基本函数的集合。


4、说一说动态链接和静态链接的区别。

  • 静态链接: 把目标程序运行时需要调用的函数代码直接链接到了生成的可执行文件中,程序在运行的时候不需要其他额外的库文件,且就算你去静态库把程序执行需要的库删掉也不会影响程序的运行,因为所需要的所有东西已经被链接到了链接阶段生成的可执行文件中。

    • Windows下以.lib为后缀,Linux下以.a为后缀。
  • 动态链接: 动态 “动” 在了程序在执行阶段需要去寻找相应的函数代码,即在程序运行时才会将程序安装模块链接在一起

    • 具体来说,动态链接就是把调⽤的函数所在⽂件模块(DLL )和调⽤函数在⽂件中的位置等信息链接进目标程序,程序运⾏的时候再从 DLL 中寻找相应函数代码,因此需要相应 DLL ⽂件的⽀持 。(Windows)

    • 包含函数重定位信息的文件,在Windows下以.dll为后缀,Linux下以.so为后缀。

了解了定义之后让我们来看一下他们的区别

  • 链接使用工具不同:

    • 静态链接由称为“链接器”的工具完成;
    • 动态链接由操作系统在程序运行时完成链接;
  • 库包含限制:

    • 静态链接库中不能再包含其他的动态链接库或者静态库;
    • 动态链接库中还可以再包含其他的动态或静态链接库。
  • 静态链接是 将各个模块的obj和库链接成一个完整的可执行程序;而动态链接是程序在运行的时候寻找动态库的函数符号(重定位),即DL