C\C++面试重点大集合(一)

本文汇总了C++面试的常见重点,包括C++与C语言的区别、面向对象思想、C++特性、函数调用约定、内存管理、深拷贝与浅拷贝、指针与引用等核心知识点,旨在帮助C++开发者准备面试,掌握关键技能。
摘要由CSDN通过智能技术生成

春招的时候,我自己整理了一份C++的面试重点,面试了七八家,发现基本没有超出这个范围的,可以说,背下本文的重点,对于想找一份C++开发工作的小伙伴来说,已经成功了一半。

本文除了帮助作者找到了大厂工作,还帮助我周围很多小伙伴拿下了心仪的offer,可以说目标不是大厂的小伙伴,只要把这些掌握了,拿一个二三线城市10k+,一线城市15k+的工作是没问题的。

本文篇幅较长,内容较长但都是精华,建议有需要的小伙伴收藏熟记!

本文针对于需求C++开发工作的小伙伴,整理了C++相关重点,本系列将持续更新,喜欢的小伙伴希望来个一键三连。

你怎么理解C语言和C++的区别?⭐⭐⭐⭐⭐

1.C语言是C++的子集,C++可以很好兼容C语言。但是C++又有很多新特性,如引用、智能指针、auto变量等。
2.C++是面向对象的编程语言,C++引入了新的数据类型——类,由此引申出了三大特性(1)封装(2)继承(3)多态。而C语言则是面向过程的编程语言。
3.C语言有一些不安全的语言特性,如指针使用的潜在危险、强制转换的不确定性、内存泄露等。而C++对此增加了不少新特性来改善安全性,如const常量、引用、cast转换、智能指针、try—catch等等;
4.C++可复用性高,C++引入了模板的概念,后面在此基础上,实现了方便开发的标准模板库STL(Standard Template Library)。STL的一个重要特点是数据结构和算法的分离,其体现了泛型化程序设计的思想。C++的STL库相对于C语言的函数库更灵活、更通用。

一句话说明什么是面向对象思想⭐⭐⭐⭐⭐

把一组数据结构和处理它们的方法组成对象(object),把相同行为的对象抽象归纳为类(class),通过类的封装(encapsulation)隐藏内部细节,通过继承(inheritance)实现类的泛化(generalization),通过多态(polymorphism)实现基于对象类型的动态分派(dynamic dispatch).

简述下C++语言的特点⭐⭐⭐⭐

1、在C语言的基础上进行扩充和完善,使C++兼容了C语言的面向过程特点,又成为了一种面向对象的程序设计语言;
2、可以使用抽象数据类型进行基于对象的编程;
3、可以使用多继承、多态进行面向对象的编程;
4、可以担负起以模版为特征的泛型化编程。
C++与C语言的本质差别:在于C++是面向对象的,而C语言是面向过程的。或者说C++是在C语言的基础上增加了面向对象程序设。

C++的函数调用约定方式⭐⭐⭐⭐

1、__cdecl

__cdecl调用约定又称为 C 调用约定,是 C/C++ 语言缺省的调用约定。参数按照从右至左的方式入栈,函数本身不清理栈,此工作由调用者负责,返回值在EAX中。由于由调用者清理栈,所以允许可变参数函数存在,如int sprintf(char* buffer,const char* format,…);。

2、__stdcall
__stdcall 很多时候被称为 pascal 调用约定。pascal 语言是早期很常见的一种教学用计算机程序设计语言,其语法严谨。参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在EAX中。

3、__fastcall
顾名思义,__fastcall 的特点就是快,因为它通过 CPU 寄存器来传递参数。他用 ECX 和 EDX 传送前两个双字(DWORD)或更小的参数,剩下的参数按照从右至左的方式入栈,函数自身清理堆栈,返回值在 EAX 中。

4、__thiscall
这是 C++ 语言特有的一种调用方式,用于类成员函数的调用约定。如果参数确定,this 指针存放于 ECX 寄存器,函数自身清理堆栈;如果参数不确定,this指针在所有参数入栈后再入栈,调用者清理栈。__thiscall 不是关键字,程序员不能使用。参数按照从右至左的方式入栈。

C++文件编译与执行的四个阶段⭐⭐⭐⭐

1)预处理:根据文件中的预处理指令来修改源文件的内容

2)编译:编译成汇编代码

3)汇编:把汇编代码翻译成目标机器指令

4)链接:链接目标代码生成可执行程序

动态链接与静态链接?两者有什么区别⭐⭐⭐⭐

链接分为静态链接和动态链接。

1.静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;生成的静态链接库,Windows下以.lib为后缀,Linux下以.a为后缀。

2.而动态链接,是在链接的时候没有把调用的函数代码链接进去,而是在执行的过程中,再去找要链接的函数,生成的可执行文件中没有函数代码,只包含函数的重定位信息,所以当你删除动态库时,可执行程序就不能运行。生成的动态链接库,Windows下以.dll为后缀,Linux下以.so为后缀。

区别

1.静态链接是将各个模块的obj和库链接成一个完整的可执行程序;而动态链接是程序在运行的时候寻找动态库的函数符号(重定位)

2.静态链接运行快、可独立运行;动态链接运行较慢(事实上,动态库被广泛使用,这个缺点可以忽略)、不可独立运行。

3.静态链接浪费空间,存在多个副本,同一个函数的多次调用会被多次链接进可执行程序,当库和模块修改时,main也需要重编译;动态链接节省空间,相同的函数只有一份,当库和模块修改时,main不需要重编译。

深拷贝和浅拷贝⭐⭐⭐⭐

浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的改变。
深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。
假设B复制了A,修改A的时候,看B是否发生变化:
如果B跟着也变了,说明是浅拷贝,拿人手短!(修改堆内存中的同一个值)
如果B没有改变,说明是深拷贝,自食其力!(修改堆内存中的不同的值)

指针和引用 ⭐⭐⭐⭐⭐

本质:
引用是别名,指针是地址

1.指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。
这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变&#

  • 49
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 56
    评论
评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值