常见C++笔试面试题整理

论坛 期权论坛 期权     
CVer   2019-7-14 18:11   4921   0
点击上方“CVer”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作者:阿贵
https://zhuanlan.zhihu.com/p/69999591
本文已授权,未经允许,不得二次转载
注:本文内容很长很硬,强力建议收藏后,反复浏览
gcc 和 g++的区别
简单来说,gcc与g++都是GNU(组织)的一个编译器。需要注意以下几点:
  • gcc与g++都可以编译c代码与c++代码。但是:后缀为.c的,gcc把它当做C程序,而g++当做是C++程序;后缀为.cpp的,两者都会认为是C++程序。
  • 编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接。
  • 编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接(当然可以选择手动链接,使用命令如下),所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。
  1. gcc main.cpp -lstdc++
复制代码
gcc编译的四个步骤, 以最简单的hello.c为例子
一步到位:gcc hello.c这条命令隐含执行了(1)预处理(2)编译(3)汇编(4)链接这里未指定输出文件,默认输出为a.outgcc编译C源码有四个步骤:预处理 ----> 编译 ----> 汇编 ----> 链接现在我们就用gcc的命令选项来逐个剖析gcc过程。1)预处理(Pre-processing)在该阶段,编译器将C源代码中的包含的头文件如stdio.h添加进来参数:”-E”用法:gcc -E hello.c -o hello.i作用:将hello.c预处理输出hello.i文件。2)编译(Compiling)第二步进行的是编译阶段,在这个阶段中,gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。参数:”-S”用法:gcc –S hello.i –o hello.s作用:将预处理输出文件hello.i汇编成hello.s文件。3)汇编(Assembling)汇编阶段是把编译阶段生成的”.s”文件转成二进制目标代码“.o”文件参数:“-c”用法:gcc –c hello.s –o hello.o作用:将汇编输出文件hello.s编译输出hello.o文件。4)链接(Link)在成功编译之后,就进入了链接阶段。用法:gcc hello.o –o hello作用:将编译输出文件hello.o链接成最终可执行文件hello。运行该可执行文件,出现正确的结果如下。>>> ./helloHello World!
C++11包含大量的新特性:包含lambda表达式,类型推导keyword : auto、decltype,和模板的大量改进。
decltype实际上有点像auto的反函数,auto能够让你声明一个变量。而decltype则能够从一个变量或表达式中得到类型
nullptr是为了解决原来C++中NULL的二义性问题而引进的一种新的类型,由于NULL实际上代表的是0,
简化的for循环,能够用于遍历数组、容器、string以及由begin和end函数定义的序列(即有Iterator),for (auto p : m)
lambda表达式,能够用于创建并定义匿名的函数对象,以简化编程工作。Lambda的语法例如以下: [函数对象參数](操作符重载函数參数)->返回值类型{函数体}
  1. vector iv{5, 4, 3, 2, 1};int a = 2, b = 1;for_each(iv.begin(), iv.end(), [b](int &x){coutunsigned 无符号类型,取值范围只包括正值
  2. 41、友元函数和友元类
  3. 友元提供了不同类的成员函数之间、类的成员函数和一般函数之间进行数据共享的机制。
  4. 通过友元,一个不同函数或者另一个类中的成员函数可以访问类中的私有成员和保护成员。
  5. 友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。
  6. 1)友元函数
  7. 有元函数是可以访问类的私有成员的非成员函数。它是定义在类外的普通函数,不属于任何类,但是需要在类的定义中加以声明。
  8. friend 类型 函数名(形式参数);
  9. 一个函数可以是多个类的友元函数,只需要在各个类中分别声明。
  10. 2)友元类
  11. 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。
  12. friend class 类名;
  13. 使用友元类时注意:
  14. (1) 友元关系不能被继承。
  15. (2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
  16. (3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看类中是否有相应的申明
  17. c++函数库中一些实用的函数
  18. 1. __gcd(x, y)
  19. 求两个数的最大公约数,如__gcd(6, 8) 就返回2。
  20. 2. reverse(a + 1, a + n + 1)
  21. 将数组中的元素反转。a 是数组名,n是长度,跟 sort 的用法一样。值得一提的是,对于字符型数组也同样适用。
  22. 3. unique(a + 1, a + n + 1)
  23. 去重函数。跟sort的用法一样。不过他返回的值是最后一个数的地址,所以要得到新的数组长度应该这么写: _n = unique(a + 1, a + n + 1) - a - 1.
  24. 4.lower_bound(a + 1, a + n + 1, x); upper_bound(a + 1, a + n + 1, x)
  25. lower_bound是查找数组中第一个大于等于x的数,返回该地址,同理也是 pos = lower_bound(a + 1, a + n + 1, x) - a
  26. upper_bound是查找第一个大于x的数,用法和lower_bound一样
  27. 复杂度是二分的复杂度,O(logn)。(其实就是代替了手写二分)
  28. 5.fill(a + 1, a + n + 1, x)
  29. 例如
  30. [code]int
复制代码
数组:
  1. fill(arr, arr + n, 要填入的内容);
复制代码
  1. vector
复制代码
也可以:
  1. fill(v.begin(), v.end(), 要填入的内容);
复制代码
fill(vector.begin(), cnt, val); // 从当前起始点开始,将之后的
  1. cnt
复制代码
个元素赋值为
  1. val
复制代码

memset(arr, val, cnt); // 在头文件[code][/code]里。
将数组a中的每一个元素都赋成x,跟memset的区别是,memset函数按照字节填充,所以一般memset只能用来填充char型数组,(因为只有char型占一个字节)如果填充int型数组,除了0和-1,其他的不能。

参考:
https://www.cnblogs.com/liufei1983/p/7099401.html
https://blog.csdn.net/ljh0302/article/details/81098764


如果你想了解国内各大公司的面试经验、如何内推、学习路线、知识题库、秋招攻略和Offer如何选择等资料的,欢迎加入2019AI算法岗求职群(知识星球)

[h1]2019AI算法岗求职群(知识星球)[/h1]
本星球不仅面向今年2020届)找工作的人群(研一/研二/大三等),还面向刚入学或已工作的人群。目前已有超过1080+位同学加入星球旨在分享AI算法岗的秋招准备攻略(含刷题)、面试经验和内推机会(含提前批)

希望这个星球可以让你少走一些弯路
扫码进星球

如果喜欢招聘/面经/内推,麻烦给个在看

麻烦给我一个在看!
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:10
帖子:2
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP