校招c语言面试题目及答案,C/C++学习之路(一)校招后端面试题及答案(作者回忆版)...

1.结构体对齐的问题

数据在计算机中一般是以8字节的整数倍为一个存储单元来存储的,而结构体中包含的各种数据类型并不一样长,结构体的总大小可能是5字节或是7字节等等。计算机一次只能存取整数个存储单元的数据,所以无论是5字节的数据还是8字节的数据,计算机都要存取两次。综上,结构体对齐可以方便计算机存取数据,减轻I/O压力。

那么,对齐的结构体的大小怎么计算呢?用以下两条的规则确定:(一)前面的单元的大小必须是后面单元大小的整数倍,如果不是就补齐。

(二)整个结构体的大小必须是最大字节的整数倍

相关知识:计算机组成原理

2.static关键字的解释

(一)在c语言中

定义在函数内部的static型的变量的值不会在函数调用后消失,而是会被保留。定义在函数外部的static只在文件内可视。

解释:函数内部的局部变量、函数参数,是放在系统栈内的,随着调用结束,栈中的数据会消失,所以函数内部的局部变量的值会随着函数调用结束而消失。但static型的变量放在静态区(全局变量也放在这里),不会随着函数调用结束而被丢弃。

(二)在C++中

static的作用主要有(1)隐藏(函数/变量均可)(2)确保变量的生存期(记忆功能和全局生存性)(3)默认初始化为0。

(4)静态全局变量不会被外部文件所用(即私有化),普通全局变量可以被外部文件使用。

特别的,对C++中的类使用static关键字,有以下特征:

(一)static静态成员函数属于类,而不是属于某个对象。

(二)由于(一),static静态成员函数没有this指针,只能访问静态成员函数和静态成员变量。反过来,非静态成员函数可以访问静态成员函数和静态成员变量。

(三)不能把静态成员函数定义为虚函数。

(四)static不能继承,virtual隐性继承。

(五)静态成员变量要初始化

(六)static不增加额外时空开销,可以方便地用于子类和父类的通信。

(七)在类外初始化,不加权限修饰符,一般格式为:::=

3.隐藏、覆盖与重载的区别

覆盖:指子类覆盖父类函数。

特征:(1)分别位于子类和父类中

(2)函数名字和参数要相同

(3)父类的函数是虚函数

隐藏:子类屏蔽了父类的同名函数(与参数列表无关)

特征(满足其一即可):

(1)子类父类函数同名,但参数列表不同

(2)父类没virtual,子类父类函数同名且参数列表相同

重载:在同一个访问区内被声明的几个同名函数,按照其参数列表,编译器决定调用哪个函数。被重载的函数可以被virtual修饰,也可以不被virtual修饰。

4.extern关键字解释

(一)告诉编译器这个模块或者函数,定义在别的文件中。

(二)与“C”连用时,表示按照C的规则去翻译

5.const关键字解释

限定一个变量不允许改变,产生静态作用。节省空间,编译器不为const分配内存,而是放在符号表中,使其成为一个编译期间存在的常量,没有存储和读内存的操作,效率比较高。另外,由于const是一个常量,可以保护一些内容。

const定义常量,只是给出了对应的内存地址,而#define则是给出了立即数。所以const常量在程序运行过程中只有一份拷贝,而#define定义在内存中有若干份拷贝。

6.内联函数与宏定义

内联函数是由inline关键字声明的函数,是C++的一个特殊的函数,它建议编译器将函数体直接插入函数调用处,而非通过函数调用机制调用,在编译阶段完成。

宏定义是在预编译阶段完成,要给能加括号的东西都加括号。

7.左值和右值

左值:代表一个在内存中占有确定位置的变量。

右值:非左值。

8.C++的多态性

一句话概括,在基类中用virtual修饰成员函数,在子类中重写该函数。虚函数肯定是类的成员函数。

存在虚函数的类都有一个一维的虚表,类的对象有一个指向虚表开始的指针vptr,虚表与类对应,虚指针与对象相对应。

虚函数表并不真实存在,只是虚表的一部分。

虚表的结构:

offset

RTTI

虚函数1

虚函数2

多态性就是一个接口多种实现,抽象类至少包含一个虚函数的类。(抽象类就是申明了纯虚函数的类)。

9.为什么含虚函数的类中析构函数要定义成虚函数?

派生类的析构函数只会析构它自己的那部分,如果基类的虚构函数不是虚函数,则不能调用基类的析构函数析构从基类继承来的那部分成员,所以会出现删一般的现象,从而造成内存泄漏。

10.为什么构造函数不要定义成虚函数?

在基类的构造过程中,虚函数的调用从不会传递到派生类中。析构函数不要抛出异常,否则可能会导致程序不正常退出。

11.友元类和友元函数

在C++中,类的成员数据通常都是私有的,当我们需要一个可以随时访问私有成员不属于该类的函数时,就把这个函数定义为友元函数,友元不能继承,是单向友元。

12.STL容器底层实现

vector:动态数组

双端队列:双向列表

双端链表:双端数组

set:红黑树

map:红黑树

stack:list

priority_queue:vector实现

hash_set:hash表

13.红黑树,B树,B+树

(1)红黑树是二叉查找树,也是平衡树。红黑树是一种含有红黑结点并且能自平衡的二叉查找树。红黑树不是完美平衡二叉树,而是黑色平衡二叉树。

(一).每个结点不是黑色就是红色

(二).根节点是黑色的

(三).每个叶子都是黑的

(四).任意根节点到任一叶子的路径都包含同样多的黑色结点。

三种平衡策略:左旋、右旋、变色。

红黑树插入的总是红色结点。

(2)B树是一种树状数据结构,是为了硬盘或者其他存储设备设计的一种多叉树。一个含有n个结点的B树高度是lgn。可以在O(lgn)内实现插入和删除。

一棵m阶B树的特性如下:

(一)每个节点最多有m个孩子

(二)除根结点和叶子结点外,每个结点至少有ceil(m/2)个孩子

(三)每个非终端结点不包含记录

B+树的叶子包含全部关键字信息,每个非终端结点都是索引,VSAM

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值