嵌入式软件工程师面试题——2025校招社招通用(C/C++)(四十三)

说明:

  • 面试群,群号: 228447240
  • 面试题来源于网络书籍,公司题目以及博主原创或修改(题目大部分来源于各种公司);
  • 文中很多题目,或许大家直接编译器写完,1分钟就出结果了。但在这里博主希望每一个题目,大家都要经过认真思考,答案不重要,重要的是通过题目理解所考知识点,好应对题目更多的变化;
  • 博主与大家一起学习,一起刷题,共同进步;
  • 写文不易,麻烦给个三连!!!

前面1-15已经是C/C++,但是由于前面写的比较混乱,把八股文和题目混在了一起,所以从这一篇开始重新整理重新写,前面1-15也就可以选看了,希望多多支持!

目录

1.STL的resize和reserver的区别

2.为什么基类的构造函数和析构函数不能被继承

3.C++中如何阻止一个类被实例化

4.纯虚函数指的是什么?

5.C++中哪些情况只能初始化列表,而不能赋值?

6.new和malloc

7.在1G内存的计算机中能否malloc(1.2G)?为什么?(2021浙江大华二面问题)

8.extern”C” 的作用

9.static的用法(定义和用途)(必考)

10.const常量和#define的区别(编译阶段、安全性、内存占用等)

11.变量的作用域(全局变量和局部变量)

12.sizeof 与strlen (字符串,数组)


1.STL的resize和reserver的区别

答案:

resize改变容器含有元素的数量,比如:resize(15),原来的大小是10,那么使用resize之后就会增加5个为0的元素。

reserver改变容器的最大容量capacity,不会生成元素,如果改变之后容器容量大于当前的capacity,那么就会出现分配一个空间,把之前的元素全部盖被到新的空间中。

2.为什么基类的构造函数和析构函数不能被继承

答案:

派生类在构造函数中要对自己的自身成员初始化,也要对继承过来的基类成员进行初始化,当基类没有默认构造函数的时候,通过在派生类的构造函数初始化列表中调用基类的构造函数初始化。

3.C++中如何阻止一个类被实例化

答案:

可以通过使用抽象类,或者将构造函数说声明为private,抽象类之所以能被实例化,是因为抽象类不能代表一类具体的事物,他是对多种相似的具体事物的共同特征的一中抽象。

4.纯虚函数指的是什么?

答案:

含有纯虚函数的类称为抽象类,抽象类不能生成对象,纯虚函数永远不会被调用,他们呢主要是用来统一管理子类对象。

5.C++中哪些情况只能初始化列表,而不能赋值?

答案:

在c++中赋值就是删除原值,赋予新值,初始化列表是开辟空间和初始化同时完成

1.类中的const ,reference(引用)成员变量时,只能初始化

2.若成员类型是没有默认构造函数的类,只能使用初始化列表

3.派生类在构造函数中要对自己的自身成员初始化,也要对继承过来的基类成员进行初始化,当基类没有默认构造函数的时候,通过在派生类的构造函数初始化列表中调用基类的构造函数初始化

6.newmalloc

答案:

1 malloc free c++/c 语言的库函数,需要头文件支持 stdlib.h new delete C++ 的关键字,不需要头文件,需要编译器支持;
2 )使用 new 操作符申请内存分配时,无需指定内存块的大小,编译器会根据类型信息自行计算。而malloc则需要显式地支持所需内存的大小。
3 new 操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,故new 是符合类型安全性的操作符。而 malloc 内存分配成功则是返回 void ,需要通过强制类型转换将 void 指针转换成我们需要的类型。
4 new 内存分配失败时,会抛出 bad_alloc 异常。 malloc 分配内存失败时返回 NULL

7.1G内存的计算机中能否malloc(1.2G)?为什么?(2021浙江大华二面问题)

答案:

是有可能申请 1.2G 的内存的。
解析:回答这个问题前需要知道 malloc 的作用和原理,应用程序通过 malloc 函数可以向程序的虚拟空间申请一块虚拟地址空间,与物理内存没有直接关系,得到的是在虚拟地址空间中的地址,之后程序运行所提供的物理内存是由操作系统完成的。 

8.extern”C” 的作用

答案:

我们可以在 C++ 中使用 C 的已编译好的函数模块,这时候就需要用到 extern”C” 。也就是 extern“C” 都是在c++文件里添加的。
extern 在链接阶段起作用(四大阶段:预处理 -- 编译 -- 汇编 -- 链接)。

9.static的用法(定义和用途)(必考)

答案:

1 )用 static 修饰局部变量:使其变为静态存储方式 ( 静态数据区 ) ,那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中。
2 )用 static 修饰全局变量:使其只在本文件内部有效,而其他文件不可连接或引用该变量。
3 )用 static 修饰函数:对函数的连接方式产生影响,使得函数只在本文件内部有效,对其他文件是不可见的(这一点在大工程中很重要很重要,避免很多麻烦,很常见)。这样的函数又叫作静态函数。使用静态函数的好处是,不用担心与其他文件的同名函数产生干扰,另外也是对函数本身的一种保护机制。

10.const常量和#define的区别(编译阶段、安全性、内存占用等)

答案:

#define max 100 ; 定义的常量是没有类型的(不进行类型安全检查,可能会产生意想不到的错误),所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define 所定义的宏变量在预处理阶段的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;
const int max = 255 ; 定义的常量有类型(编译时会进行类型检查)名字,存放在内存的静态区域中,在编译时确定其值。在程序运行过程中const 变量只有一个拷贝,而 #define 所定义的宏变量却有多个拷贝,所以宏定义在程序运行过程中所消耗的内存要比const 变量的大得多。

11.变量的作用域(全局变量和局部变量)

答案:

全局变量:在所有函数体的外部定义的,程序的所在部分(甚至其它文件中的代码)都可以使用。全局变量不受作用域的影响(也就是说,全局变量的生命期一直到程序的结束)。
局部变量:出现在一个作用域内,它们是局限于一个函数的。局部变量经常被称为自动变量,因为它们在进入作用域时自动生成,离开作用域时自动消失。关键字auto 可以显式地说明这个问题,但是局部变量默认为auto ,所以没有必要声明为 auto
局部变量可以和全局变量重名,在局部变量作用域范围内,全局变量失效,采用的是局部变量的值。

12.sizeof strlen (字符串,数组)

答案:

1. 如果是数组
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
printf(“sizeof 数组名=%d\n”,sizeof(a));
printf(“sizeof *数组名=%d\n”,sizeof(*a));
}
运行结果:
sizeof 数组名=20
sizeof *数组名=4
2. 如果是指针, sizeof 只会检测到是指针的类型,指针都是占用 4 个字节的空间( 32 位机)。
sizeof 是什么?是一个操作符 , 也是关键字,就不是一个函数,这和 strlen() 不同, strlen()是一个函数。 那么 sizeof 的作用是什么?返回一个对象或者类型所占的内存字节数。我们会对 sizeof() 中的数据或者指针做运算吗?基本不会。例如sizeof(1+2.0), 直接检测到其中类型是 double, 即是 sizeof(double) = 8
如果是指针,sizeof 只会检测到是指针的类型,指针都是占用 4 个字节的空间( 32 位机)。
char *p = "sadasdasd";
sizeof(p):4
sizeof(*p):1//指向一个char类型的
除非使用 strlen() ,仅对字符串有效,直到 '\0' 为止了,计数结果不包括 \0
要是非要使用 sizeof 来得到指向内容的大小,就得使用数组名才行, 如
char a[10];
sizeof(a):10 //检测到a是一个数组的类型。

  • 24
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值