首页 > 编程语言 >C++面试考点

C++面试考点

时间:2024-05-09 17:12:14浏览次数:13  
标签:初始化 函数 右值 左值 C++ 面试 考点 内存 cpp

c++基础

1、malloc/free和new/delete的异同点?

2、cpp程序运行时内存模型?

答:代码区,只读的区域,是代码被翻译成二进制机器指令存储的地方;数据区,分为初始化数据区和未初始化数据区,用来存储全局变量和static变量的地方;堆区,动态内存分配的地方,new和malloc分配就是从此处分配;栈区,函数调用所有使用的内存区域,遵循先进后出的规则。

3、cpp程序函数调用,内存中栈是如何工作的?

答:当函数调用时,首先,函数返回地址入栈,然后形参入栈,局部变量入栈,执行函数,函数返回值存入cpu寄存器,最后依次出栈。

4、指针和引用的异同点?

答:

5、union共用体的作用是什么?

答:union有不同类型的成员,共用同一块内存地址,这样做的目的是节省内存。可以用在有不同类型数据,但不同时有效的情况。

6、struct如何确定占用内存大小?

答:首先,确定对齐标准,以结构体成员中最大内存成员为标准;然后,依次存放结构体成员,要求每次按照对齐标准取数据,能完整的把某些数据成员取出来;最后,struct内存大小必须为对齐标准的整数倍。

7、extern C的作用是什么?

答:为了处理C/Cpp混合编程的重要特性。主要是cpp为了兼容c语言,调用c编写好的库,由于cpp为了支持函数重载,c++编译的函数名与c语言编译的函数名不一致,因此cpp调用c编译好的库函数,需要使用extern c来告诉编译器,按照c的标准来链接c函数。

8、机器大小端存储问题?

机器大端存储,是说将数据字节的高位放到内存低地址部分。(按照人习惯的顺序存储)

机器小端存储,是说数据高位放到内存的高地址部分。

使用union关键字可以方便识别机器按照大端存储还是小端存储。

9、static的用法?

答:首先,修饰局部变量,将其变成静态变量,在main函数运行前进行初始化,仅仅初始化一次,后面不再初始化,函数运行结束,该变量仍在内存的数据区。

第二,修饰全局变量和全局函数,隐藏全局变量,让其仅能在当前文件中可见。与extern作用正好相反。

第三,修饰类的的函数,让函数变成静态函数,该函数属于类,不属于类实例化的对象。

第四,类的静态成员变量,需要在类的外部初始化。

10、const的用法。

答:将变量变成只读,不能被修改。mutable可以突破const的封锁,就像friend可以突破类中private成员封锁一样。

const 修饰变量:将其变成只读。

const type * 指针:不能通过指针修改指向内存的内容。

type * const 指针:不能指针的指向。

const修饰类的成员变量:成员变量只能在初始化列表中初始化。

const修饰类的成员函数:成员函数不能修改成员变量的值。

const类,类的实例化对象只能访问const成员函数。

11、volatile关键字的作用?

答:阻止编译器对volatile修饰的变量进行优化,是的每次访问变量都是从内存读取,而不是从cpu寄存器里面读取。

用到的场景有:首先,多线程应用共享同一个变量;第二,并行设备的硬件寄存器。

12、nullptr和NULL的区别?

答:

13、为什么浮点数相等的判断不推荐使用==?

答:因为浮点数只有23位有效数字,能表示数的精读有限,浮点数在运算过程中会造成精读或多或少的损失,即使在数学上相等,但是计算机里不一定相等,

因此推荐使用相减求绝对值小于一个epsilon来判断是否相等。

14、cpp中异常的使用。

cpp中用于异常处理的关键字有try,catch,throw,所有异常的基类是std::exception,位于头文件<exception>中。这些东西都是需要积累的。

15、cpp中的类型转换有哪些?

答:static cast 和 dynamic cast 两个关键字。static cast在编译时进行类型转换,dynamic是在运行时进行类型转换,dynamic是安全的类型转换,如果转换失败,抛出std::bad_cast异常。

在基类转子类的过程中,如果使用static cast转换,即使基类转错误的子类,也会正常运行,不会报错。此时程序已经发生了错误。

因此,基类转子类,必须使用dynamic cast.

16、explicit关键字的作用是什么?

答:阻止类的构造函数提供默认的隐式转化,当类的构造函数只有一个参数时,编译器默认为该类提供了默认的隐式转换机制。explicit就可以阻止这个隐式转换的生成。

17、c++多态是如何实现的,从编译器的角度讲一讲?(什么是动态绑定和静态绑定)

18、什么是cpp抽象类。

答:至少包含一个纯虚函数的类。virtual void foo() = 0;

19、如何禁止程序自动生成拷贝构造函数和赋值函数。

答:使用delete关键字,c++11引入的标准。

20、什么是一致性哈希?(未知)

答:

21、c++从代码到可执行文件经历了什么?

答:预处理-编译-汇编-链接。

预处理:会翻译所有的预处理指令,展开宏定义,执行条件编译指令,执行#include指令,删除所有注释,添加行号,保留#pragma编译器指令。生成.i文件

编译:将预处理好的文件进行编译,经过词法分析、语法分析、语义分析、优化等过程,生成汇编代码文件。生成.s文件。

汇编:将汇编代码翻译成机器指令。生成.o文件。

链接:将.o文件链接成可执行文件。分为静态链接和动态链接。静态链接,就是不库文件全部打包进可执行文件;动态链接,就是不把库加载进去,把位置留好,等运行时再动态加载库。

运行:代码区、数据区、堆区、栈区。

22、c语言如何实现cpp的类继承和多态?

答:

23、cpp的几种锁?(没有解释清楚)

答:互斥锁用于互斥,条件变量用于同步。

24、为什么c++没有垃圾回收机制?

答:因为垃圾回收会带来空间和时间上的开销,垃圾回收存储动态分配内存的指针计数,需要另开一个线程在空闲时间释放没有用到的内存。

内存管理

1、类对象的存储空间大小?

答:类对象非静态成员的内存之和+虚函数指针的大小。

2、c++程序的内存分区。

答:从低地址到高地址分别为:代码区、数据区(常量区、全局变量区(全局变量和static变量))、堆区、空闲区、栈区。

c++11标准

1、auto和decltype的作用是什么?

答:auto用来自动推断变量的类型,省去了写类型的麻烦。decltype用来求表达式的类型。

2、nullptr是c++11新增的关键字。

答:为了兼容C的NULL而引入,C中,NULL被定义为(void*) 0,而在cpp中,NULL被定义为 0。nullptr是明确的指针类型,不会与整型0混淆。

3、c++类中比较关键的函数有哪些?

答:默认构造函数,拷贝构造函数,移动构造函数,赋值操作符,移动赋值操作符,析构函数。

4、lambda表达式的作用是什么?

答:就是匿名函数,用来简化函数的定义。说白了还是语法糖。

5、智能指针的作用是什么?

答:为了解决堆内存泄露和动态内存分配引发的错误,而引入智能指针,c++11引入了三个智能指针,shared ptr, unique ptr, weak ptr。shared ptr是最常用的智能指针,

可以使用多个指针指向同一块堆内存,unique ptr只允许一个指针指向分配的堆内存,weak ptr是为了解决shared ptr指针循环引用无法释放内存而引入,就是为了解决循环引用问题。

6、auto_ptr的用法是什么?

答:

7、手写实现智能指针需要重写什么函数?

答:额外提供计数指针、构造函数、拷贝构造函数、赋值运算符、移动构造函数。移动赋值运算符。

标准模板库STL

0、STL中,有哪些模块。

答:基本包括:容器、迭代器、算法。他们各自有什么用途,如何进入计算机图形学

1、STL中,allocator的用法是什么?

答:

2、STL中,什么是迭代器。怎么使用?

答:迭代器是STL提供用来访问和遍历容器的机制。迭代器提供了一组标准的方式来访问容器,用户无需关注容器内部实现,就能实现访问和遍历。基本用法就是for循环,begin()和end()。

3、什么cpp中的左值和右值?(回答的太好了!!)

总结:cpp中所有变量的值都可以分为左值和右值,左值是有名字能取地址的变量的值,一般位于等号左边,右值就是没有名字不能取地址的变量的值,左值一般在等号左边,右值一般在等号右边。举个例子,int a = b+2,其中,a就是左值,(b+2)就是右值。右值包括:纯右值和将亡值,纯右值是cpp98就有的,将亡值是cpp11提出的标准,纯右值包括字面常量、临时变量、函数返回值、lambda表达式,将亡值就是那种通过盗窃其他变量地址空间来的值,如std::move获取的值,通过T&&强转获取的值。

继续:左值引用和右值引用的区别?首先,都是引用,都必须在声明时初始化,左值引用是对左值进行的引用,右值引用是对右值初始化进行的引用。左值引用只能使用左值进行初始化,不能使用右值进行初始化。const 左值引用可以使用左右值初始化。右值引用只能使用右值初始化。因此, int& a = 10; 这句话编译不通过,因为10是右值,a是左值引用,只能通过左值进行初始化。

4、什么是完美转发?

答:

5、什么是移动语义?

答:

6、cpp中特性萃取是什么?traits有什么作用?<type_traits>

答:traits是一种模板编程技术,用于编译时获取类型的信息。

7、常见容器性质总结。

vector:是顺序表,内存空间连续,可以随机存取,缺点就是插入和删除时间复杂度高,内存必须连续,内存空间扩容耗时。

list:是双向链表,内存空间不一定连续,不能随机存取,但是插入和删除效率高,扩容时时间消耗低。

deque:双端队列,内存不一定连续,底层通过分块存储和分块查找的方式实现,可以随机存取,是vector+list的升级版,但是只能在收尾操作,也不存在扩容耗时的问题。

map:有序字典,底层使用红黑树实现。查询时间复杂度为O(logn)

unordered_map:无序字典,底层使用哈希存储实现。高效查询,使用哈希表,查询和插入时间复杂度为O(1),但是建立哈希表的时间过程较长。

8、红黑树的基本概念是什么?现场写红黑树的可能性比较小。

答:如何进行

9、哈希表解决冲突的办法有哪些?

答:线性探测法:就是冲突了向后一位存放;拉链法:相同关键字的地方,使用一个链表来存储,链表可以自由扩展;再散列:冲突了,则使用新的哈希函数在散列;平方探测法:按照交替检测的方式来查看冲突。

标签:初始化,函数,右值,左值,C++,面试,考点,内存,cpp
From: https://www.cnblogs.com/LadissonLai/p/18182727

相关文章

  • GCC编译C++步骤
    在使用GCC编译器编译多个源文件时,你需要将所有需要编译的源文件列出,并在命令行中将它们一起传递给GCC。GCC会将这些源文件编译成目标文件(.o文件),然后链接成最终的可执行文件或动态库。下面是一个示例命令行:bashCopycodeg++-cfile1.cppfile2.cppfile3.cpp在这个......
  • C语言调用C++的共享库SO
    C语言调用C++的共享库SO今天在项目中,遇到了一个问题,对方提供给我们一个.h的声明文件(使用的是cpp语言),和一个动态库so。但是我们项目中用的是C语言,我们如何来调用so库中的方法呢?我们都知道,C++在设计时,兼容C语言,可以直接调用C语言库中的接口,但是C语言调用C++的接口就会比较困难,比如C......
  • C++: fatal error: Killed signal terminated program cc1plus
    C++:fatalerror:Killedsignalterminatedprogramcc1plus1.在Linux系统中进行C++编译时,出现如下报错,导致编译中止:C++:fatalerror:Killedsignalterminatedprogramcc1pluscompilationterminated.2.解决方法——swap分区查阅相关信息后,认为是虚拟机内存不足造成......
  • mysql面试题
    索引失效1.模糊查询2.使用函数和计算:3.不匹配的数据类型:4.使用OR条件的不同索引列:5.复合索引的最左前缀原则:6.索引列在条件中使用负向查询:如NOTIN、NOTEXISTS、NOTLIKE等负向查询条件可能会导致索引失效。7.索引列在条件中使用NULL:当索引列中包含NULL值,并且在查询条件......
  • 131. 分割回文串-c++
    给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]classSolution{public:vector<vector......
  • 79. 单词搜索-c++
    给定一个mxn二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。示例1:输入......
  • C++基础-如何引入第三方静态库、动态库或自定义库 摘自 https://blog.csdn.net/u01310
    C++无论是内置库还是第三方库,都需要自己手动进行查找、配置、引入等工作。本文即是帮助完成C++项目对于库、框架如何完成依赖引入达成可调用的目的,重点讲述开发工具VisualStudio中的操作静态库(.lib)静态库引入适用用于大部分无开源的第三方库,开发者不需要关心库的具体实现如何,......
  • UEC++做拖拽时的UDragDropOperation 的PayLoad是什么
    在UnrealEngine中,使用C++进行拖拽操作时,UDragDropOperation类的Payload成员变量允许你传递与拖拽操作相关的任何类型的数据。它通常被用来存储一些关于被拖拽元素的信息,这些信息在拖拽开始时被设置,然后可以在拖拽结束时被检索和使用。Payload是一个UObject*类型的指针,这意......
  • 在UEC++中的FReply
    在UnrealEngine中,FReply是一个核心类,用于在UI事件处理中返回和控制事件的传播。它主要用于SlateUI框架,是处理输入事件(如点击、拖拽、鼠标移动等)时的回应类型。FReply用于告诉Slate事件系统一个特定的事件是否被处理,以及是否应该将事件继续传递给其他控件。例如,当一个按钮被点......
  • C++容器
    C++容器bitset构造函数//1.默认构造函数:0bitset<10>a; //a:0000000000//2.用一个数值初始化//(1)当用一个数值去构造的时候,其实就是将数值在内存中的存储方式显示出来。(数值在内存中是以补码形式存储的)//(2)若bitset的位数n小于数值的位数,只取数值(小端的)前n位......