【3】C++岗位求职面试八股文系列文章(语言基础)

第一篇:语言基础

第二篇:设计模式

第三篇:数据库

第四篇:计算机网络

第五篇:操作系统

第六篇:LInux

第七篇:数据结构

第八篇:智力题

[41]如果在类的析构函数中调用delete this,会发生什么?

会导致堆栈溢出。原因很简单,delete的本质是“为将被释放的内存调用一个或多个析构函数,然后,释放内存”。显然,delete this会去调用本对象的析构函数,而析构函数中又调用delete this,形成无限递归,造成堆栈溢出,系统崩溃

[42]空类的大小多少字节

在C++中空类会占一个字节,空类同样可以被实例化,并且每个实例在内存中都有独一无二的地址

带有虚函数的类大小多加4,虚表指针

[43]this指针调用成员变量时,堆栈会发生什么变化?

This指针首先入栈,然后成员函数的参数从右向左进行入栈,最后函数返回地址入栈

[44]类对象的大小受哪些因素影响?

  1. 类的非静态成员变量大小,静态成员不占据类的空间,成员函数也不占据类的空间大小;
  2. 内存对齐另外分配的空间大小,类内的数据也是需要进行内存对齐操作的;
  3. 虚函数的话,会在类对象插入vptr指针,加上指针大小;
  4. 当该类是某类的派生类,那么派生类继承的基类部分的数据成员也会存在在派生类中的空间中,也会对派生类进行扩展。(不管任何类型继承,都会吧父类的全部继承下来)

[45]正常函数与虚函数的区别?

正常函数是强⾏计算地址;虚函数时通过偏移+的⽅式

[46]存储器的分层以及每⼀层的⼤⼩是多少?以及作⽤

[47]GDB调试

Gcc hello.c -o hello -gGdb helloSet args 10 20 30 40 50Show argsRun/start

[48]前置++i与后置i++

前置返回一个引用,后置返回一个对象解释链接

++a表示取a的地址,增加它的内容,然后把值放在寄存器中;a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值;进行前置++的时候,将i进行加1,然后返回i的引用。而i++是先创建一个i的副本,然后在对i进行加1,最后返回i的副本的值

最好使⽤前置++,因为他不会创建临时对象,进⽽不会带来构造和析构⽽造成的格外开销

前置++和后置++,有3点不同:

  1. 返回类型不同
  2. 形参不同
  3. 效率不同 a++的返回类型为什么要是const对象呢? 对于内置类型,(i++)++这样的表达式是不能通过编译的。自定义类型的操作符重载,应该与内置类型保持行为一致

++a的返回类型为什么是引用呢?与内置类型的行为保持一致。前置++返回的总是被自增的对象本身。因此,++(++a)的效果就是a被自增两次。

[49]RAII机制

RAIL:直译过来是“资源获取即初始化”,也就是说在构造函数中申请分配资源,在析构函数中释放资源。在资源管理方面,智能指针(std::shared_ptr和std::unique_ptr)是RAII最具代表性的实现,使用了智能指针,可以实现自动的内存管理,再也不用担心忘记delete造成内存泄漏了。

// 在状态管理方面,线程同步中使用std::unique_lock或std::lock_guard对互斥量std::mutex进行状态管理也是RAII的典型实现,通过这种方式,我们再也不用担心互斥量之间的代码出现异常而造成线程死锁。

// 总结起来说,RAII的核心思想是将资源或状态与类对象的生命周期绑定,通过C++语言机制,实现资源与状态的安全管理。

[50]简述C++从代码到可执行二进制文件的过程

C++和C语言类似,一个C++程序从源码到执行文件,有四个过程,预编译、编译、汇编、链接预编译:这个过程主要的处理操作如下:(1) 将所有的#define删除,并且展开所有的宏定义(2) 处理所有的条件预编译指令,如#if、#ifdef(3) 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。(4) 过滤所有的注释(5) 添加行号和文件名标识。编译:这个过程主要的处理操作如下:(1) 词法分析:将源代码的字符序列分割成一系列的记号。(2) 语法分析:对记号进行语法分析,产生语法树。(3) 语义分析:判断表达式是否有意义。(4) 代码优化:(5) 目标代码生成:生成汇编代码。(6) 目标代码优化:汇编:这个过程主要是将汇编代码转变成机器可以执行的指令。链接:将不同的源文件产生的目标文件进行链接,从而形成一个可以执行的程序。

[51]静态链接和动态链接

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

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

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

[52] static关键字的作用

1.定义全局静态变量和局部静态变量:在变量前面加上static关键字。初始化的静态变量会在数据段分配内存,未初始化的静态变量会在BSS段分配内存。直到程序结束,静态变量始终会维持前值。只不过全局静态变量和局部静态变量的作用域不一样;

2.定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数。静态函数只能在本源文件中使用;在变量类型前加上static关键字,变量即被定义为静态变量。静态变量只能在本源文件中使用;//示例static int a;static void func();

在c++中,static关键字可以用于定义类中的静态成员变量:使用静态数据成员,它既可以被当成全局变量那样去存储,但又被隐藏在类的内部。类中的static静态数据成员拥有一块单独的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间。类内申明,类外初始化 在编译阶段分配内存

在c++中,static关键字可以用于定义类中的静态成员函数:与静态成员变量类似,类里面同样可以定义静态成员函数。只需要在函数前加上关键字static即可。如静态成员函数也是类的一部分,而不是对象的一部分。只能调用静态成员;

静态成员函数中的变量是可以访问类的私有构造函数的。静态成员函数不可以同时声明为 virtual、const、volatile函数

当调用一个对象的非静态成员函数时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针(划重点,面试题常考)。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问。

[53]This

[54]常对象:

[55]数组和指针的区别概念:

(1)数组:数组是用于储存多个相同类型数据的集合。 数组名是首元素的地址。(2)指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。 指针名指向了内存的首地址。

区别:(1)赋值:同类型指针变量可以相互赋值;数组不行,只能一个一个元素的赋值或拷贝

(2)存储方式:数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,数组的存储空间,不是在静态区就是在栈上。指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。由于指针本身就是一个变量,再加上它所存放的也是变量,所以指针的存储空间不能确定。

(3)求sizeof:数组所占存储空间的内存大小:sizeof(数组名)/sizeof(数据类型)在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。

p+1会使得指针指向二维数组的下一行,p-1会使得指针指向数组的上一行。

[56]二维指针指向二维数组

链接

[57]Linux内核下的存储存储区划分(linux内存分为内核区和用户区)

Linux内核下的存储主要分为5大段:栈、堆、数据段、代码段、不可访问区域;

栈:又称“运行时栈”,按照“后进先出”原则操作数据,主要存储局部变量,用完即销毁。

堆:又称“运行时堆”,是一块自由存储区域,由用户手动申请和销毁空间,一般和malloc, free, calloc, realloc等内存操作关键字一起出现。

数据段:主要由三部分组成(.bass段、.data段、.rodata段),.bass主要存放未初始化静态数据;.data存放已经初始化静态数据;.rodata存放只读数据(常量)。

代码段:主要分两部分(.text和.init),.text存放用户程序代码;.init存放可执行程序初始化代码。

[58]堆与栈对比

[59]区别各种指针类型

[60]什么是函数指针,如何定义函数指针,有什么使用场景

概念:函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。定义形式如下:int func(int a);

int (*f)(int a);

f = &func;

函数指针的应用场景:回调(callback)。我们调用别人提供的 API函数(Application Programming Interface,应用程序编程接口),称为Call;如果别人的库里面调用我们的函数,就叫Callback。

[后续]见C++岗位求职面试八股文第四篇

更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317

企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm

机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0

软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM

更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH

欢迎关注、收藏、点赞后进行问题咨询及秋招建议!

#晒一晒我的offer##牛客在线求职答疑中心##如何判断面试是否凉了##软件开发薪资爆料##我的实习求职记录#
软件开发八股面经 文章被收录于专栏

包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等

全部评论
感谢分享,加油牛友!😁
点赞 回复 分享
发布于 2024-04-23 19:14 山东

相关推荐

不愿透露姓名的神秘牛友
07-22 11:33
点赞 评论 收藏
分享
06-01 21:50
已编辑
天津理工大学 Java
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
3
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务