C++面试问题补充记录

1、面试重点:

OOP:面向对象编程
overload:隐藏:子类有父类同名函数或变量,子类有定义,优先调用子类,要调用父类,要加作用域限定符
override:覆盖:虚函数实现有虚函数表,派生类重写了函数就调用派生类的函数
oversee:重载:根据传入的参数类型不同,调用的函数不同使用的函数也不同
String优化:
Copy On write 写时复制
SSO -多核实现(短字符串优先)
Eager Copy深拷贝
容器底层实现
vector
list
deque
配置器空间配置器
快:空间换时间,减少系统调用malloc(涉及到切换用户态和内核态)

OOA:面向对象分析,object-oriented Anylysis
OOD:面向对象设计,obejct-oriented Design

UML使用
1.基类和派生类的使用(类与类之间的关系——继承(泛化))
2.1对多的关系(关联关系)
3单向关联关系(A has B,彼此并不负责对方的声明周期)
4.聚合关系 (整体部分不负责局部对象的销毁,声明周期不受整体的关系,菱形
5.组合关系(依赖关系)A use B 是偶然的临时的并非固定
在代码上:

B作为A的成员函数参数
B作为A的成员函数的局部变量(B作为A的成员函数返回值)
A的成员函数调用B的静态方法

6.依赖关系(单例模式)

在这里插入图片描述
单一职责原则:
在这里插入图片描述

开放闭合原则
在这里插入图片描述
对非虚函数的定义
在这里插入图片描述

在这里插入图片描述

2.常见C++面试题

1.变量的声明和定义有什么区别

声明:不分配内存
定义:为变量分配内存和存储空间
总结:一个变量可以声明多次,但是定义只能由一次
补充:extern是修饰变量的声明,说明这个变量将会在其他文件以外,或者在文件后面定义

在这里插入图片描述

2 .简述#ifdef、#else、#endif和#ifndef的作用

1)利用#ifdef、#endif将某程序功能模块包括进去,以向特定用户提供该功能。在不需要时用户可轻易将其屏蔽。
在这里插入图片描述

2)在子程序前加上标记,以便于追踪和调试
在这里插入图片描述

3)应对硬件的限制。由于一些具体应用环境的硬件不一样,限于条件,本地缺乏这种设备,只能绕过硬件,直接写出预期结果,而采用条 件编译 , 可以 减少 被 编译的 语句 ,从 而减 少目标 程序 的长 度,减 少运 行时间。

3 写出int 、bool、 float 、指针变量与 “零值”比较的if 语句

在这里插入图片描述

4.结构体可以直接赋值吗

  • 声明时可 以直接 初 始化 ,同 一 结构体 的不 同对 象之 间也可 以直 接赋 值,但 是当 结构体中含有指 针“成 员 ”时 一定 要 小心

当有多个指针指向同一片内存,某个指针释放着段内存可能会导致其他指针的非法操作,因 此 在释 放前 一 定要确 保其 他指 针不 再使用 这段 内存 空间

5.sizeof 和strlen 的区别

  • sizeof是一个操作符,strlen是库函数。
  • sizeof的参数可以是数据的类型,也可以是变量,而strlen只能以结尾为‘\0’的字符串作参数。
  • 编译器在编译时就计算出了sizeof的结果,而strlen函数必须在运行时才能计算出来。并且sizeof计算的是数据类型占内存的大小,而strlen计算的是字符串实际的长度。
  • 数组做sizeof的参数不退化,传递给strlen就退化为指针

6 C 语言的关键字 static 和 C++ 的关键字 static 有什么区别

  • 在 C 中 s t at i c 用 来修 饰局 部 静态 变量外部 静态变 量函数 。而 C ++中除 了上述功能外 ,还用 来 定义 类的 成 员变量 和函 数。 即静 态成员 和静 态成 员函数

注意:编 程时 s t a ti c 的 记忆 性,和全 局性 的特点 可以 让在不 同时 期调 用的函 数进行通信, 传递信 息 ,而 C+ + 的 静态成 员则 可以在 多个 对象实 例间 进行 通 信,传 递信息。

7 C 语言的 malloc 和 C++ 中的 new 有什么区别

  • 使用范围:new 、delete 是操作符,可以重载,只能在C++ 中使用。
  • malloc、free 是函数,C、C++ 中都可以使用。
  • C++的调用构造和析构函数:new 可以调用对象的构造函数,对应的delete 调用相应的析构函数
  • c的不调用构造和析构函数:malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数
  • 返回指针不一样:new 、delete 返回的是某种数据类型指针,malloc、free 返回的是void 指针

8 写一个 “标准”宏MIN

#define min(a,b) ((a) <= (b)?(a) : (b) )

9 ++i和i++的区别

++i 先自增1 ,再 返 回, i + +先 返回i,再 自增 1

10 volatile有什么作用

  • 多线程间被几个任务共享的变量(PC)
  • 状态寄存器一类的并行设备硬件寄存器。(嵌入式)
  • 一个中断服务子程序会访问到的非自动变量。(嵌入式)

11 一个参数可以既是const又是volatile吗

  • 可以,用 cons t 和 vo l a t il e 同 时 修饰 变量, 表示 这个变 量在 程序 内部是 只读 的, 不能改变的 ,只在 程 序外 部条 件 变化下 改变 ,并 且编 译器不 会优 化这 个变量 。

12 *a 和&a 有什么区别

&a:其含义 就是 “ 变量 a的 地址”

  • a:用在不同 的地 方, 含 义也不一样 。

1)在声明语句中,*a只说明a是一个指针变量,如int *a;
2)在其他语句中,*a前面没有操作数且a是一个指针时,*a代表指针a指向的地址内存放的数据,如b=*a;
3)*a前面有操作数且a是一个普通变量时,a 代 表 乘 以 a , 如 c = b×a。(x就是*)

13 用 C 编写一个死循环程序

while(1)
{

}

14.结构体内存对齐问题

  • 请写出以 下代码 的 输出 结果 :
#include<stdio.h>
struct S1
{
	int i:
	char j:
	int a:
	double b;//因为有8个字节的double,所以这个结构体以8字节对齐
};
struct S2
{
	int i:
	char j:4;
	//double b;
	int a:4;
};
struct S3
{
	int i;
	char j;
	double b;
	//int a;
};
int main()
{
	printf("%d\n",sizeof(S1)); // 输出24
	printf("%d\n",sizeof(S1); // 输出12
	printf("%d\n",sizeof(S3)); // 输出16
	return 0;
}

15 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?

  • 全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放);
  • 而局部变量存在于模块(子程序,函数)中,只有所在模块可以访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存释放。
  • 操作系统和编译器,可能是通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载.局部变量则分配在堆栈里面。

16 简述C、C++程序编译的内存分配情况

  • 从静态存储区域分配:

内存在程 序编译 时 就已 经分 配 好,这 块内 存在 程序 的整个 运行 期间 都存在 。速 度快、不容易出 错, 因 为有 系 统会 善 后。例 如全 局变 量,s ta tic 变 量, 常量 字符串 等。

  • 在栈上分配:

在执行函 数时, 函 数内 局部 变 量的存 储单 元都 在栈 上创建 ,函 数执 行结束 时这 些存储单元自动 被释 放 。栈 内 存分 配 运算内 置于 处理 器的指 令集 中,效 率很 高, 但是分配的内存容 量有限 。

  • 从堆上分配:

即动态内存分配 。程序 在运 行 的时候 用 m a lloc 或 new 申请任 意大 小 的内存 ,程序员自己 负责在 何 时 用 fr e e 或del ete 释放 内存 。动态 内存 的生 存期由 程序 员决定,使用 非常灵 活 。如 果在 堆 上分配 了空 间, 就有 责任回 收它 ,否 则运行 的程 序会出现内存泄 漏,另 外 频繁 地分 配 和释放 不同 大小 的堆 空间将 会产 生 堆内 碎块 。

17 简述strcpy、sprintf 与memcpy 的区别

  • 1)操作对象不同:操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型, 目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型
  • 2)执行效率不同:memcpy 最高,strcpy 次之,sprintf 的效率最低。
  • 3)实现功能不同:strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字 符串的转化,memcpy 主要是内存块间的拷贝。

18 请解析(*(void (*) ( ) )0)( )的含义

  • void (*0)( ) : 是一个返回值为void,参数为空的函数指针0。//后面括号( )表示参数,*0表示函数指针名为0,void表示返回类型
  • (void (*)( )) 0: 把0转变成一个返回值为void,参数为空的函数指针。
  • *(void (*)( ))0: 在上句的基础上加*表示整个是一个返回值为void,无参数,并且起始地址为0的函
    数的名字。
  • (*(void (*)( ))0)( ): 这就是上句的函数名所对应的函数的调用。

19 C语言的指针和引用和c++的有什么区别?

1)指针有自己的空间,而引用只是个别名
2)sizeof(int*)的大小为8字节,而引用则是被引用对象的大小;
4)指针和引用使用++运算符的意义不一样;
5)如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。

20 typedef 和define 有什么区别

  • 1)用法不同:

①typedef 用来定义一种数据类型的别名,增强程序的可读性。
②define 主要用来定义 常量,以及书写复杂使用频繁的宏。

  • 2)执行时间不同

typedef 是编译过程的一部分,有类型检查的功能。
define 是宏定义,是预编译的部分,其发生在编译之前,只是简单的进行字符串的替换,不进行类型的检查。

3)作用域不同:

typedef 有作用域限定。
define 不受作用域约束,只要是在define 声明后的引用 都是正确的。

21 指针常量与常量指针区别

1)指针常量 是指定 义 了一 个指 针 ,这个 指针 的值 只能 在定义 时初 始化 ,其他 地方 不能改
变。常量 指针 是 指定 义 了一 个 指针, 这个 指针 指向一 个只 读的对 象, 不能 通过常 量
指针来改 变这个 对 象的 值。
2)指 针常量 强调 的是 指针的 不可 改变性 ,而 常量 指针强 调的是指针 对其所 指 对象 的不 可 改变性 。

22 简述队列和栈的异同

队列和栈 都是线 性 存储 结构 , 但是两 者的 插入 和删 除数据 的操 作不 同,队 列是 “先进
先出”, 栈是 “ 后进 先 出”

42 C++设计一个类不能被继承

1)final关键字
在这里插入图片描述

2)基类的构造函数是private的
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值