推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

【干货】常见C++笔试面试题分享

   2023-08-03 网络整理佚名1910
核心提示:2、C++中指针和引用的区别3)指针传参的时候,还是值传递,指针本身的值不可以修改,需要通过解引用才能对指向的对象进行操作引用传参的时候,传进来的就是变量本身,因此变量可以被修改特征:相同范围(同一个类中)、函数名字相同、参数不同、关键字可有可无4)类中:修饰成员函数,表示该函数属于整个类所有,不接受this指针,只能访问类中的成员变量

1.C和C++的区别

1)C是一种面向过程的语言,一种结构化语言,考虑如何通过过程处理输入以获得输出; C++是一种面向对象的语言,主要特点是“封装、继承和多态性”。 封装隐藏了实现细节,使代码模块化; 派生类可以继承父类的数据和方法,扩展现有模块,实现代码复用; 多态是“一个接口,多个实现”,通过派生类重写父类的虚函数来实现接口的复用。

2)C和C++动态管理内存的方法不同。 C 使用 /free,而 C++ 也有 new/ 关键字。

3)C++支持函数重载,但C不支持函数重载

4)C++中有引用,但C中不存在引用的概念

2.C++中指针和引用的区别

1)指针是一个新的变量,它存储了另一个变量的地址,我们可以通过访问这个地址来修改另一个变量;

引用只是一个别名,或者说是变量本身,对引用的任何操作都是对变量本身的操作,以达到修改变量的目的

2)引用只有一层,而指针可以有多层

3)当指针作为参数传递时,仍然是按值传递。 指针本身的值不能被修改。 需要取消引用才能对指向的对象进行操作

通过引用传递参数时,传入的是变量本身,因此可以修改变量

3. 结构体与社区联盟(union)的区别

结构:将不同类型的数据组合成一个整体,是自定义类型

社区:几个不同类型的变量一起占用一段内存

1)结构体中的每个成员都有自己独立的地址,并且它们同时存在;

社区中所有成员占用相同的内存,他们不能同时存在;

2)()是内存对齐后所有成员的长度之和,(union)是内存对齐后最长数据成员的长度,

为什么结构要内存对齐?

4.#和const的区别

1)#定义的常量没有类型,给出的是立即数; const 定义的常量有一个类型名并存储在静态区域中

2)加工阶段不同。 #定义的宏变量在预处理时被替换,并且可能存在多份。 const定义的变量是在编译时确定的,并且只有一份。

3)#定义的常量不能用指针指向,而const定义的常量可以用常量地址的指针指向

4) #可以定义简单函数,const不能定义函数

5.重载、重写、重写,三者的区别

1)、几个语义相似的函数用相同的名字来表示,但参数和返回值不同,这就是函数重载

特点:作用域相同(同一个类中),函数名相同,参数不同,关键字可选

2)、派生类重写基类的虚函数,实现接口的复用

特点:作用域不同(基类和派生类),函数名相同,参数相同,基类中必须有关键字(必须是虚函数)

3)、派生类屏蔽其基类同名函数

特点:不同的作用域(基类和派生类)、相同的函数名、不同的参数或相同的参数且没有关键字

6.new、、、free之间的关系

new/,/free都是动态分配内存的方式

1)严格指定打开空间的大小,而new只需要对象名

2)new为对象分配空间时,会调用该对象的构造函数,并调用该对象的析构函数

既然有了/free,为什么C++中还需要new/呢?

因为 /free 是库函数而不是运算符,所以不能将执行构造函数和析构函数的能力强加于 /free

7. 与[]的区别

析构函数只会被调用一次,而[]会调用每个成员的析构函数

用new分配的内存被释放,用new[]分配的内存用[]释放

8.您使用过STL库吗? 常见的STL容器有哪些? 你用过多少种算法?

STL由两部分组成:容器和算法

容器是存储数据的地方,比如数组,分为串行容器和关联容器两种

顺序容器,其中的元素不一定是有序的,但可以排序,如list、queue、stack、heap、-queue、slist

关联容器,内部结构是一棵平衡二叉树,每个元素都有一个键值和一个实值,如map、set、

算法包括排序、复制等,以及每个容器的具体算法

迭代器是STL的本质。 迭代器提供了一种方法,使其能够按顺序访问容器中包含的元素,而无需暴露容器的内部结构。 它将容器与算法分离,使两者独立设计。

9.你知道const吗?解释一下它的作用

const修饰类的成员变量意味着常量不能被修改

const修饰类的成员函数意味着该函数不会修改类中的数据成员,也不会调用其他非const成员函数

10. 虚拟功能是如何实现的?

每个包含虚函数的类都至少有一个对应的虚函数表,虚函数表中存储了该类的所有虚函数对应的函数指针(地址)。

类的示例对象不包含虚函数表,仅包含虚指针;

派生类生成与基类兼容的虚函数表。

11.堆和栈的区别

1)栈存放函数的参数值和局部变量,由编译器自动分配和释放

堆是new分配的内存块,由应用程序控制,需要程序员手动释放。 如果没有,操作系统会在程序结束后自动回收它。

2)由于堆分配需要使用频繁的new/,导致内存空间不连续,会出现大量碎片

3)堆的增长空间向上,地址较大,栈的增长空间向下,地址较小

12.关键词的作用

1)函数体:被修改的局部变量的作用域是函数体。 与auto变量不同的是,它的内存只分配一次,因此下次调用时它的值保持最后的值

2)模块内:修饰的全局变量或全局函数可以被模块内的所有函数访问,但不能被模块外的其他函数访问,使用范围仅限于声明它的模块内

3)在类中:修改成员变量,表示该变量属于整个类,并且该类的所有对象只有一份

4)类中:修改成员函数,表示该函数属于整个类,不接受this指针,只能访问类中的成员变量

注意和const的区别! ! ! const强调值不可修改,强调唯一副本,对于所有类的对象

13、STL(关联容器)中map和set的原理

Map和Set的底层实现主要是通过红黑树来实现

红黑树是一种特殊的二叉搜索树

1)每个节点要么是黑色,要么是红色

2)根节点为黑色

3)每个叶节点(NIL)都是黑色的。 【注:这里的叶子节点是指为空(NIL或NULL)的叶子节点! ]

4)如果一个节点是红色的,那么它的子节点必须是黑色的

5) 从一个节点到其后代的所有路径都包含相同数量的黑色节点。

特征4)和5)决定了没有一条路径会比其他路径长两倍,因此红黑树是一棵近乎平衡的二叉树。

14.##“file.h”的区别

前者是从标准库路径中找到的

后者来自当前的工作路径

15.什么是内存泄漏? 面对内存泄漏和指针越界,你有什么方法呢?

动态分配内存开辟的空间在使用后没有手动释放,导致内存一直被占用,这就是内存泄漏。

方法:/free要匹配。 分配指针时,要注意分配的指针是否需要释放; 使用时记住指针的长度,防止越界

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON