c++开发 高质量 面试题分享

1 编译和解释型语言分别有什么特点,各举例一种类型 

编译型语言和解释型语言是两种不同的程序设计语言的类型,它们的主要区别在于程序的执行方式和效率。
编译型语言是指将源代码通过编译器转换成机器码,然后直接在目标平台上运行的语言。
解释型语言是指将源代码通过解释器逐行翻译成机器码,然后在运行时执行的语言。下面是它们各自的特点和例子:

- 编译型语言的特点:
    - 执行效率高,因为只需编译一次,运行时无需再翻译。
    - 依赖于编译器和目标平台,不同的平台需要不同的编译器和可执行文件。
    - 错误检查在编译阶段进行,如果有语法错误,无法生成可执行文件。
    - 一般需要显式声明变量的类型,有较强的类型检查。
    - 编译型语言的例子有:C、C++、Pascal、Object-C等。
- 解释型语言的特点:
    - 执行效率低,因为每次运行都需要翻译,且有解释器的开销。
    - 具有良好的跨平台性,只要有相应的解释器,就可以在任何平台上运行。
    - 错误检查在运行阶段进行,如果有语法错误,会在执行到错误的地方停止。
    - 一般不需要声明变量的类型,有较弱的类型检查。
    - 解释型语言的例子有:JavaScript、Python、Erlang、PHP、Perl、Ruby等。

(1) 编译型语言和解释型语言详解 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/37721614.
(2) 一文了解解释型语言和编译型语言之区别 - 知乎. https://zhuanlan.zhihu.com/p/111763425.
(3) 编译型语言、解释型语言各自的特点_墨染枫林的博客-CSDN博客. https://blog.csdn.net/weixin_38055381/article/details/82420661.
(4) 解释型语言_百度百科. https://baike.baidu.com/item/解释型语言/8888952.
(5) undefined. https://bing.com/search?q=.

2 c语言中的define和c++中的const有什么区别,哪种更好?

c语言中的define和c++中的const都是用来定义常量的,但是它们有一些重要的区别,我会简单地介绍一下:

- define是一个预处理指令,它在编译前就会把源代码中的宏替换成指定的值,而不进行任何类型检查或错误检测。

const是一个关键字,它在编译时会给变量分配内存,并进行类型检查和错误检测。
define定义的常量只是一个文本,它不占用内存空间,也没有作用域的限制。

const定义的常量是一个变量,它占用内存空间,也有作用域的限制。
define定义的常量可以通过#undef来取消定义,然后重新定义。

const定义的常量不能被重新赋值或修改。
define定义的常量可能会产生边界效应或括号问题,因为它只是简单地进行文本替换。

const定义的常量不会有这样的问题,因为它是一个真正的变量。

一般来说,在c++中,我们更推荐使用const来定义常量,因为它有以下优点:

- const可以提高程序的可读性和可维护性,因为它可以明确地表达变量的类型和意义。
- const可以提高程序的安全性和效率,因为它可以防止不小心修改变量的值,也可以让编译器进行优化和检查。
- const可以增加程序的灵活性和扩展性,因为它可以与其他关键字(如volatile, static, extern等)结合使用,也可以用于修饰函数的参数和返回值。

如果你想了解更多关于define和const的区别和用法,请参考以下链接¹²³⁴。希望对你有帮助

源: 与必应的对话, 8/8/2023
(1) C++ 宏定义 #define 和常量 const 的区别 - 菜鸟教程. https://www.runoob.com/note/12963.
(2) C语言中const的用法详解 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/373141333.
(3) 常量(const 和 #define 的区别)_Mikchy的博客-CSDN博客. https://blog.csdn.net/Mikchy/article/details/107072337.
(4) c++中的const与c语言中的const的区别 - 朴素贝叶斯 - 博客园. https://www.cnblogs.com/zjuhaohaoxuexi/p/15975257.html.
(5) undefined. https://bing.com/search?q=.

 3 空指针和野指针有什么区别?

空指针和野指针是两种不同的指针类型,它们的主要区别在于指针所指向的内存地址是否有效和可知。我会简单地介绍一下它们的定义和特点:

  • 空指针是指不指向任何有效数据的指针,用NULL表示。空指针的值为0,表示没有分配任何内存地址。空指针可以用来判断一个指针是否被初始化或赋值,也可以用来避免野指针的出现。空指针不能被解引用,否则会导致段错误或异常。
  • 野指针是指指向一个不确定或无效的内存地址的指针,它的值不为NULL,但也不是一个合法的地址。野指针可能是由于未初始化、越界访问、释放后使用等原因造成的。野指针的危害很大,因为它可能会修改或破坏程序中的重要数据或代码,导致程序崩溃或出现难以调试的错误。

4 c++中可以使用malloc和free来申请和释放内存,为什么还需要new和delete?

  • malloc和free是C语言中用来分配和释放内存的函数,它们只能操作字节级别的内存,不能处理对象的构造和析构。
  • new和delete是C++中用来分配和释放内存的运算符,它们不仅能操作字节级别的内存,还能根据对象的类型调用相应的构造函数和析构函数,完成对象的初始化和清理工作。
  • new和delete还有一些其他的优点,比如:
    • new可以自动计算所需内存的大小,而malloc需要手动指定字节数。
    • new可以进行重载,而malloc不能。
    • new可以抛出异常,而malloc只能返回NULL。
    • new可以配合placement new在指定位置创建对象,而malloc不能。
    • new可以使用new[]和delete[]来分配和释放数组,而malloc和free不能。

5 什么情况下C++需要将析构函数写成虚函数?

  1. 什么情况下C++需要将析构函数写成虚函数?
  • 虚析构函数是一种特殊的虚函数,它用来保证在多态情况下,通过基类指针删除派生类对象时,能够正确地调用派生类的析构函数,从而避免内存泄漏或其他错误。
  • 如果一个类有可能被其他类继承,并且可能通过基类指针操作派生类

你可能感兴趣的:(面试题,c++,c++总结性的东西,缓存,c++)