• C++面试


    https://blog.csdn.net/weixin_44363885/article/details/99567746

    这一行是个 贼鸡巴重要的链接!!!  

    很好的总结

    我直接复制到下面了:

    社招:社招的同学,无论是1-3年经验,还是中途转行,都可参考。
    写简历必须有针对性,以后台开发为例,请去拉勾网 / 猎聘 / 智联招聘等网站,多看看后台开发的JD.,有针对性地突出自身优势,每种岗位的技术需求的不一样的!不一样的!做简历千遍一律,必将死沉大海。同样道理,必须突出项目/实验中使用到的技术关键字。
    互联网企业流动量很大,岗位是很缺的,如果简历投中了,一般几天内一波面完,基本形式是 初面-复面-HR面。BAT的流程相对很长,通常有4-6轮面试,每轮之间甚至隔很久,进大厂请做好持久战准备。

    温馨提示:面试官也是普通员工,可能是你未来的经理或总监,他们也没有专业培训怎样面试,题目都是网上找的,所以多刷经典题。
    校招的面试官是有些套路的,有题库,所以还是多刷题。
    社招时,他们多半基于自身项目用到的知识,问你有没有相关经验,经验比技术重要。没经验不要紧,赶紧做个相关的例子,放在Github,面试时秀出来并详细介绍,狠狠的加分。

    C和C++语言基础

    参考书籍:《C++ primer》,《effective C++》,《STL源码解析》,《深度搜索C++对象模型》《C++高级进阶编程》

    后台开发必考:C++五大储存区和map or set用法,别问我为什么。

    1. extern关键字的作用:

      有两个作用,①与“C”连用时,如extern "C" void fun(int a, int b);   是告诉编译器后面的函数内容是按照C的规则编译

            ②如extern int a ,是让它声明的函数或变量在其他模块里也能用

      详见:https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

    2. static关键字作用

       在C里的作用:①static修饰局部变量的时候,局部变量会变成局部静态变量,存储在静态区,其生命周期也随之改变(在main函数之前初始化,在程序结束后销毁。)所以在函数退出时,局部静态变量不会被销毁,会保留原来的数据。再次调用函数的时候会拿到当时的数据。

              ②static修饰全局变量的时候,(并不改变存储位置,因为全局变量本来就在静态区),这个全局变量会收到限制,只能被包含它的定义的文件所访问。(这样两个不同的文件可以有相同名字的全局变量,互不影响)

              ③static修饰的函数,(和②类似),只能被包含该函数的定义的文件所访问。因此static实现了不同文件中定义同名的函数,而不发生冲突。

       在C++的作用:除了包含在C里面的作用外,还有:对于静态成员变量和函数,保证所有的对象只能维持同一个实例。因此,采用static可以实现不同对象之间数据共享。(也可以依此写单例模式)

    3. volatile关键字作用

     ??????????????????

    4. 说说const的作用,越多越好。const代表只读/不可修改,而不仅仅是常量。

          ①要求定义的时候必须初始化

            ②定义为const的形参,在函数内部是不可修改的

            ③把类的成员函数定义为常成员函数,不能修改类的成员变量

    5. new和malloc的区别

      ①new/delete是关键字(需编译器支持),malloc是库函数(需头文件支持)

      ②申请内存时,new无需指定大小,malloc需要

      ③new内存分配成功时,返回的是对象类型的指针,无需进行类型转换(符合类型安全)

             失败时,会抛出异常

       malloc内存分配成功时,返回的是void*,需要类型转换成我们需要的类型

             失败时,返回NULL

      ④new允许被重载,malloc不行

      ⑤malloc是从堆上动态分配内存,new是从自由存储区为对象动态分配内存。 
       自由存储区的位置取决于operator new的实现。自由存储区不仅可以为堆,还可以是静态存储区,这都看operator new在哪里为对象分配内存。

      ⑥分配内存时内存不足

        malloc动态分配内存后,如果不够用可以使用realloc函数重新分配实现内存的扩充;而new则没有这样的操作;  

      ⑦是否调用构造函数/析构函数
        使用new操作符来分配对象内存时会经历三个步骤:
    - 第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
    - 第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。
    - 第三步:对象构造完成后,返回一个指向该对象的指针。
        使用delete操作符来释放对象内存时会经历两个步骤:
    - 第一步:调用对象的析构函数。
    - 第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。
        总之来说,new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构;而malloc则不会。

    详见:https://blog.csdn.net/qq_40840459/article/details/81268252

    6. sizeof的运算结果,针对结构体对象,带虚函数类对象,指针,字符串,数组深入了解。

    建议百度问题:“sizeof() 函数求一个类的大小?”

    建议学习链接:   https://blog.csdn.net/weixin_39485901/article/details/89184488

    7. C++多态性与虚函数表
    • C++多态的实现?虚函数的作用?了解一下。
      虚函数用于实现多态,虚函数在设计上还要封装和抽象的作用,比如抽象工厂模式。
    • 虚函数表是针对类还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的?一个类是三角继承关系,它的虚函数表是什么形式?有多少个表?
    • 纯虚函数如何定义,为什么对于存在虚函数的类中需要将析构函数定义为虚函数?
    • 析构函数能抛出异常吗?构造函数呢?
    • 构造函数和析构函数中调用虚函数吗?
    • 动态绑定是如何实现的?静态多态和动态多态的区别。
      关于虚函数和继承,笔试题必考。考察输出和函数调用。

    8. 指针和引用的区别

    就按打印的笔记上的来:四条:

      ①引用是直接访问,指针是间接访问

      ②引用是变量的别名,本身不占据内存空间。而指针是个实体,有自己的内存空间

      ③引用只能在定义时被初始化一次,之后不可变;指针可变

      ④引用不可为空,指针可以

    9. 指针和数组千丝万缕的联系

    10. 智能指针是怎么实现的,什么适合改变引用计数?
        智能指针是一个类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。

        动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。

        详见:https://blog.csdn.net/lizhentao0707/article/details/81156384

         https://blog.csdn.net/weixin_30367873/article/details/99278065

    11. C++四种类型的转换。static_cast, dynamic_cast, const_cast, reinterpret_cast

    12. 内存对齐的原则,结构体中变量声明顺序不同时sizeof的大小。为什么要内存对齐。

    见:https://blog.csdn.net/JIEJINQUANIL/article/details/51445512

    13. 内联函数有什么优点?内联函数与宏定义的区别?
    • 宏定义用于计算时,有括号与没括号计算结果是不同的。

    14. C++内存管理。五大内存区(栈,堆,全局/静态区,常量区,代码区)
    • static和const声明的变量放在哪个区?
    • 全局数组最大可声明多少?局部数组最大可声明多少,如果栈不够用怎么办,可以改吗?

    15. STL标准库,基础中的要点,笔试必考,面试也必问。
    • map和set是基于什么实现的?红黑树的特点。
    • vector和list在储存上的区别。多维数组在储存上是连续的吗?
    • queue和stack的实现,是数组还是链表?
    • map中的元素是自定义结构体,这个结构体有什么要求?(需要重载operator<)

    16. 必须在构造函数初始化列表里初始化的数据成员有哪些?

    17. 什么是原子操作?++i是原子操作吗,为什么?
    • ++i和i++的区别,++i = (j++)+(++i) 结果是什么

    18. 迭代器/游标使用需要注意什么?

    19. iterator中remove和erase的区别?

    数据结构与算法

    1. 手写strcoy, strcat, strcmo, memcpy等函数

    2. 合并两个升序单链表

    3. 求一个数组中子序列的最大和

    4. 检测是否二叉查找树

    5. 删除单链表的倒数k节点;反向打印链表(递归);链表是否有环

    6. 海量数据量中检测重复多的数值(鹅厂喜欢考,海量QQ号找重复的)
    • 一百万个整数中,前100个最大的数。(划重点)
    • 一百万个整数中出现频率最高的100个数。
    海量数据的十种问题

    7. 10机制转16进制

    8. 排序算法,其实面试很少现场写快排,但要懂算法思路,算法复杂度等。排序是经典中经典,不考也要看。

    9. 实现一个string类,基础题大题。

    这一块考察范围很广,多刷题。牛客网,剑指OFFER,LeetCode等。
    鹅厂习惯手写代码,写的问题不难,都是经典算法。
    华为有机测,做的题目以考察编码逻辑为主。三道题。
    百度的题比较有深度,也是经典算法,保不准要你写个查找树的删除算法,都赶上微软了。
    大疆有机测,题目以一般基础知识为准。编程题与牛客网上的类似。
    阿里用的是JAVA,偏向推荐算法和广告大数据,本人未面过。
    其他公司,有拿个mac现场把类补全实现的;有口述加板书描述的;有一口气说N个问题,看你思路怎样的;但不管怎样,还是多刷题!算法是加分项,过不了也别担心,思路必须清晰。

    再啰嗦一句,写算法时判空和判越界和判NULL等必须写出来!

    1. 二叉树的结构,二叉查找树的实现和搜索。

    2. 二叉树的6种遍历,按层遍历。一般不会问算法题,简述即可。

    3. 什么是红黑树,与AVL树有什么区别?

    树很重要,因为map和MySQL的实现都与树有关,二叉树结构的搜索和删除插入效率都极高。树结构能用在很多地方提高性能。

    Socket编程  - TCP/IP  HTTP

    参考书籍:《图解TCP/IP》,《TCP/IP详解 卷一》,《图解HTTP》,《HTTP权威指南》

    后台开发必考TCP三次握手四次挥手,重点!
    后台开发必考TCP多连接问题,如高并发(社招)
    后台开发必考HTTP状态码和方法集,重点!

    1. TCP和UDP之间的区别
    • IP首部,TCP首部,UDP首部。一般不直接考,但要懂。
    • TCP和UDP的应用场景。
    • 如何实现可靠的UDP。(可靠的UDP,其实就是TCP好不。)

    2. TCP的三次握手和四次挥手。
    • 其中的细节要了解清楚,例如2MSL,CLOSE_WAIT,TIME_WAIT.
    • 一定要会画出整个过程图,最好是每个符号都画出来。

    3. TCP中六个标识位的作用

    4. Socket编程知识,请理解每个函数的返回值,参数值和特殊字段含义。
    • Client和Server的使用,函数调用过程是怎样的。
    • listen函数,第二个参数什么作用。
    • recv函数的返回值是什么含义。
    • 怎么判断字符接受完毕。(设计一个结束符,通常是 ' ')
    • accpet函数返回的套接字和listen中套接字的关系。

    5. TCP重发机制

    6. TCP的拥塞控制使用的算法和具体过程

    7. Http/Https 1.0 1.1 2.0的特点和区别

    8. Http返回状态码

    • 302 和 303有什么区别
    • 1xx  2xx 3xx 4xx 5xx 分别代表什么类型含义
    • 500什么时候会出现,怎么解决

    9. Http有什么方法集

    10. Https和Http的区别,如何实现加密传输?加解密方法是什么?

    11. 浏览器中输入一个URL会发生什么,用到哪些协议?

    12. 请描述服务器过程,客户端到服务器中间的过程描述一下。

    13.TCP粘包问题

    数据库 (MySQL)

    主要参考书籍:《数据库系统概念》,《高性能MySQL》

    1. SQL语言,内外连接,子查询,分组,聚集,嵌套,逻辑。手写一些例子。

    2. MySQL索引方法?索引的优化。

    3. InnoDB和MyISAM区别

    4. 什么是NoSQL

    5. 查询优化,从索引上优化,从SQL语言上优化。

    6. B-树和B+树区别。MySQL的内核是棵B+树
    注意二叉树,B树,B-树,B+树,B*树的区别。B树和B-树是一个意思。B树是M阶查找,当B树是二阶时就是二叉查找树。

    7. MySQL的联合索引,又称多列索引是什么,生效的条件是什么?

    8. 分库分表

    进程与线程

    1. 进程间的通讯方法

    方式一:管道 pipe

    方式二:消息队列 msgget

    方式三:信号 signal

    方式四:信号量 semget

    方式五:共享储存区 shmget

    方式六:共享文件映射 mmap

    方式七:套接字 socket

    2. 线程和进程有什么区别?

    答案在我的笔记本上。

    3. 线程比进程有哪些优势?

    在本博客的另一篇里面。

    3. 什么时候有多进程,什么时候用多线程?

    同上。

    4. Linux中进程和线程使用的几个函数是什么?

    5. 线程的同步方法有哪些?
    在Windows下线程同步的方式有:互斥量,信号量,事件,关键代码段,全局变量,临界区。
    在Linux下线程同步的方式有:互斥锁,自旋锁,读写锁,屏障(并发完成同一项任务时,屏障的作用特别好使) 知道这些锁之间的区别,使用场景?

    6. 关于进程调度 了解一下
    Linux进程分为两种,实时进程和非实时进程
    优先级分静态优先级和动态优先级,优先级的范围
    调度策略
    交互进程通过平均睡眠时间而被奖励

    7. 死锁,及死锁产生的必要条件,怎么防止死锁? 重点!很常考。

    8. 什么是线程安全,线程安全是否完全由线程安全的类构成?

    9.进程间是怎么通信的?线程间是怎么通信的?

    ●线程之间是如何通信的

    一个是使用全局变量进行通信,还有就是可以使用自定义的消息机制传递信息。其实因为各个线程之间它是共享进程的资源的,所以它没有像进程通信中的用于数据交换的通信方式,它通信的主要目的是用于线程同步,所以像一些互斥锁啊临界区啊CEvent事件对象和信号量对象都可以实现线程的通信和同步。

    ●进程之间是如何通信的

    进程间的通信方式有PIPE管道,信号量,消息队列,共享内存,还可以通过 socket套接字进行通信。根据信息量大小的不同可以分为低级通信和高级通信,在选择上,如果用户传递的信息较少.或是需要通过信号来触发某些行为的,一般用信号机制就能解决,如果进程间要求传递的信息量比较大或者有交换数据的要求,那么就要使用共享内存和套接字这些通信方式。

    10.线程池是什么

    线程池就是一堆已经创建好的线程,最大数目一定,然后初始后都处于空闲状态,当有新任务进来时就从线程池中取出空闲线程处理任务,任务完成之后又重新放回去,当线程池中的所有线程都在任务时,只能等待有线程结束任务才能继续执行。

    内存管理问题(社招) 

    后台开发必考内存类问题,没固定,多看。开发过程中最怕遇到内存泄漏,一定要会调试查找内存BUG,也要注意内存碎片,进程使用内存问题。不要爆内存,不要降性能。会内存管理的校招同学,有加分。

    1. 什么是内存泄漏,怎么定位内存泄漏。定位内存泄漏
    • 在windows平台下通过CRT中的库函数进行检查
    • Linux下通过工具valgrind检测

    2. 什么是内存碎片,怎么避免内存碎片。
    new申请大量不连续的空间后,剩余可用内存分布零散,无法被有效使用。这些零散的可用内存叫内存碎片。
    避免内存碎片使用伙伴算法。

    3. C++五大储存区,上文已提及。

    4. 32位系统一个进程最多可以占用多少内存。64位呢。

    5. 栈空间的最大是多少,堆空间的最大是多少。

    6. 虚拟内存的作用,虚拟内存的实现。

    7. 操作系统对内存的管理。

    8. 线程池,内存池的作用及实现方法,STL里内存池的实现方法。

    9. Linux的内存管理机制是什么。浅谈Linux的内存管理机制

    Linux操作

    主要参考书籍:《现代操作系统》,《APUE》,《UNP》,《LINUX内核设计与实现》,《深入理解LINUX内核》

    1. 怎么查看计算机状态,内存使用情况等(任务管理器)
    cpu,内存,硬盘,等等与系统性能调试相关的命令必须熟练掌握,设置修改权限 ,tcp网络状态查看,各进程状态,抓包相关等相关命令 必须熟练掌握。(top, free, df, fdisk)

    2. netstat tcpdump ipcs ipcrm这几个命令是什么作用?这是网络相关的命令,请熟悉。

    3. sed, awk, grep 三个超强大的命令,分别用于格式化修改,统计,和正则查找。请熟系。

    4. select, poll, epoll的区别。用select实现一个连接的大概步骤。

    5. frok和vfork的区别。
    fork和vfork都用于创建子进程。但是vfork创建子进程后,父进程阻塞,直到子进程调用exit()或者excle()。
    对于内核中过程fork通过调用clone函数,然后clone函数调用do_fork()。do_fork()中调用copy_process()函数先复制task_struct结构体,然后复制其他关于内存,文件,寄存器等信息。fork采用写时拷贝技术,因此子进程和父进程的页表指向相同的页框。但是vfork不需要拷贝页表,因为父进程会一直阻塞,直接使用父进程页表。

    6. exit() 与 _exit()的区别
    exit()清理后进入内核,_exit()直接陷入内核。

    7. 孤儿进程是怎么产生的?僵死进程是怎么产生的?

    8. 僵死进程的危害有哪些?怎么避免?

    其他遇到的题目

    1. 有哪些东西是编译期间确定的,哪些是运行期间确定的?
    考察编译和运行的了解。编译期间确定数组大小空间,宏定义,内联函数展开,extern变量等。运行期间确定new大小,多态类对象的函数调用,未赋值全局指针的指向等。

    2. 怎么判断大小端,怎么判断程序是32位还是64位?
    主要实现为static静态方法,首先为long分配了8个字节内存,然后为long分配了值,之后拿出long的第一个字节,如果为数据的高位,那么平台采用的是大端字节序,如果为数据的低位,那么平台采用的时小端字节序。
    sizeof 指针等于4是32位,8是64位。

    3. 内存只有2GB,怎么读入3GB的文件。
    使用mmap了解一下。

    4.打印自身代码

    笨方法:

    #include <stdio.h>
    main()
    {
      FILE *fd;
      int c;
      fd= fopen("./file.c","r");
      while ( (c=fgetc(fd)) != EOF)
      {
        printf("%c", c);
       }
      fclose(fd);
    }

    其他方法还没看。。。

    社招面试,很多会先问你做过的项目,技术大牛会从中深入,建议大家先打个草稿,突出重点,并避开自己不足的地方,临场发挥很容易踩雷。
    面试内容远不止这些,更多后续补充....

    末尾让大家思考一道题,什么情况下,等式5+5=11在数学意义下是正确的。

    参考书籍下载:计算机书籍控
    ————————————————

    未完待续.....如有错误还望指出,共同进步。

    原文链接:https://blog.csdn.net/ScnQuick/article/details/81411402

  • 相关阅读:
    从小知识开始练习
    shell的基本语法
    shell的一些简单用法
    HTML 父元素与子元素之间的margin-top问题
    HTML input文本框设置和移除默认值
    c# winform进入窗口后在文本框里的默认焦点
    c#面向对象基础 重写、虚方法、抽象类
    c#面向对象基础 封装、继承
    c#面向对象基础 静态成员、构造函数、命名空间与类库
    c#面向对象基础 类、方法、方法重载
  • 原文地址:https://www.cnblogs.com/WHUT-Simon/p/11765358.html
Copyright © 2020-2023  润新知