c++C++面试知识2——第二章 语言对比

Posted 超级无敌陈大佬的跟班

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++C++面试知识2——第二章 语言对比相关的知识,希望对你有一定的参考价值。

目录

第二章 语言对比

2.1 C++ 11 新特性

2.2 C 和 C++ 的区别

2.3 Python 和 C++ 的区别


第二章 语言对比

本章主要介绍下编程语言之间的区别,涉及到 C++、Python、Java,并对 C++ 11 的新特性进行了总结。主要考虑到面试时,面试者熟悉 C++ 的同时,或许会对其他语言有一定的了解,那面试官就不可避免的会问到不同语言之间的区别。

2.1 C++ 11 新特性

面试高频指数:★★★★☆

说明:C++11 的新特性有很多,从面试的角度来讲,如果面试官问到该问题,常以该问题作为引子,对面试者提到的知识点进行深入展开提问。面试者尽可能的列举常用的并且熟悉的特性,尽可能的掌握相关原理,下文只是对相关知识点进行了简单的阐述,有关细节还需要结合相关知识点的相关问题。
下面对常用的做一下总结:

1、auto 类型推导
auto 关键字:自动类型推导,编译器会在 编译期间 通过初始值推导出变量的类型,通过 auto 定义的变量必须有初始值

auto 关键字基本的使用语法如下:

auto var = val1 + val2; // 根据 val1 和 val2 相加的结果推断出 var 的类型,

注意:编译器推导出来的类型和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。

2、decltype 类型推导
decltype 关键字:decltype 是“declare type”的缩写,译为“声明类型”。和 auto 的功能一样,都用来在编译时期进行自动类型推导。如果希望从表达式中推断出要定义的变量的类型,但是不想用该表达式的值初始化变量,这时就不能再用 auto。decltype 作用是选择并返回操作数的数据类型。
区别:

auto var = val1 + val2; 
decltype(val1 + val2) var1 = 0; 
  • auto 根据 = 右边的初始值 val1 + val2 推导出变量的类型,并将该初始值赋值给变量 var;decltype 根据 val1 + val2 表达式推导出变量的类型,变量的初始值和与表达式的值无关。
  • auto 要求变量必须初始化,因为它是根据初始化的值推导出变量的类型,而 decltype 不要求,定义变量的时候可初始化也可以不初始化。

3、lambda 表达式
lambda 表达式,又被称为 lambda 函数或者 lambda 匿名函数。

[capture list] (parameter list) -> return type
{
   function body;
};

其中:

  • capture list:捕获列表,指 lambda 所在函数中定义的局部变量的列表,通常为空。
  • return type、parameter list、function body:分别表示返回值类型、参数列表、函数体,和普通函数一样。

4、范围 for 语句
语法格式:

for (declaration : expression){
    statement
}

参数的含义:

  • expression:必须是一个序列,例如用花括号括起来的初始值列表、数组、vector ,string 等,这些类型的共同特点是拥有能返回迭代器的 beign、end 成员。
  • declaration:此处定义一个变量,序列中的每一个元素都能转化成该变量的类型,常用 auto 类型说明符。

实例:

    for(int n : arr){
        cout << n << " ";
    }

5、右值引用
右值引用:绑定到右值的引用,用 && 来获得右值引用,右值引用只能绑定到要销毁的对象。为了和右值引用区分开,常规的引用称为左值引用。
举例:

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    int var = 42;
    int &l_var = var;
    int &&r_var = var; // error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int' 错误:不能将右值引用绑定到左值上

    int &&r_var2 = var + 40; // 正确:将 r_var2 绑定到求和结果上
    return 0;
}

6、标准库 move() 函数
move() 函数:通过该函数可获得绑定到左值上的右值引用,该函数包括在 utility 头文件中。该知识点会在后续的章节中做详细的说明。

7、智能指针
相关知识已在第一章中进行了详细的说明,这里不再重复。

8、delete 函数和 default 函数

delete 函数:= delete 表示该函数不能被调用。
default 函数:= default 表示编译器生成默认的函数,例如:生成默认的构造函数。

2.2 C 和 C++ 的区别

面试高频指数:★★★☆☆

首先说一下面向对象和面向过程:

  • 面向过程的思路:分析解决问题所需的步骤,用函数把这些步骤依次实现。
  • 面向对象的思路:把构成问题的事务分解为各个对象,建立对象的目的,不是完成一个步骤,而是描述某个事务在解决整个问题步骤中的行为。

区别和联系:

  • 语言自身:C 语言是面向过程的编程,它最重要的特点是函数,通过 main 函数来调用各个子函数。程序运行的顺序都是程序员事先决定好的。C++ 是面向对象的编程,类是它的主要特点,在程序执行过程中,先由主 main 函数进入,定义一些类,根据需要执行类的成员函数,过程的概念被淡化了(实际上过程还是有的,就是主函数的那些语句。),以类驱动程序运行,类就是对象,所以我们称之为面向对象程序设计。面向对象在分析和解决问题的时候,将涉及到的数据和数据的操作封装在类中,通过类可以创建对象,以事件或消息来驱动对象执行处理。
  • 应用领域:C 语言主要用于嵌入式领域,驱动开发等与硬件直接打交道的领域,C++ 可以用于应用层开发,用户界面开发等与操作系统打交道的领域。
  • C++ 既继承了 C 强大的底层操作特性,又被赋予了面向对象机制。它特性繁多,面向对象语言的多继承,对值传递与引用传递的区分以及 const 关键字,等等。
  • C++ 对 C 的“增强”,表现在以下几个方面:类型检查更为严格。增加了面向对象的机制、泛型编程的机制(Template)、异常处理、运算符重载、标准模板库(STL)、命名空间(避免全局命名冲突)。

2.3 Python 和 C++ 的区别

面试高频指数:★★★☆☆

区别:

  • 语言自身:Python 为脚本语言,解释执行,不需要经过编译;C++ 是一种需要编译后才能运行的语言,在特定的机器上编译后运行。
  • 运行效率C++ 运行效率高,安全稳定。原因:Python 代码和 C++ 最终都会变成 CPU 指令来跑,但一般情况下,比如反转和合并两个字符串,Python 最终转换出来的 CPU 指令会比 C++ 多很多。首先,Python 中涉及的内容比 C++ 多,经过了更多层,Python 中甚至连数字都是 object ;其次,Python 是解释执行的,和物理机 CPU 之间多了解释器这层,而 C++ 是编译执行的,直接就是机器码,编译的时候编译器又可以进行一些优化
  • 开发效率:Python 开发效率高。原因:Python 一两句代码就能实现的功能,C++ 往往需要更多的代码才能实现。
  • 书写格式和语法不同:Python 的语法格式不同于其 C++ 定义声明才能使用,而且极其灵活,完全面向更上层的开发者。

____________________________________________________________

参考:

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/cpp-interview-highlights/o5v4w6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于c++C++面试知识2——第二章 语言对比的主要内容,如果未能解决你的问题,请参考以下文章

c语言常见面试题

3小时学会C语言横向对比/纵向剖析,轻松学习C语言

python知识点及面试面试大集合

3小时学会C语言横向对比/纵向剖析,轻松学习C语言

3小时学会C语言横向对比/纵向剖析,轻松学习C语言

台湾省某著名CPU公司C语言面试题,值得学习!