文章目录
- 1、面试重点:
- 2.常见C++面试题
- 1.变量的声明和定义有什么区别
- 2 .简述#ifdef、#else、#endif和#ifndef的作用
- 3 写出int 、bool、 float 、指针变量与 “零值”比较的if 语句
- 4.结构体可以直接赋值吗
- 5.sizeof 和strlen 的区别
- 6 C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
- 7 C 语言的 malloc 和 C++ 中的 new 有什么区别
- 8 写一个 “标准”宏MIN
- 9 ++i和i++的区别
- 10 volatile有什么作用
- 11 一个参数可以既是const又是volatile吗
- 12 *a 和&a 有什么区别
- 13 用 C 编写一个死循环程序
- 14.结构体内存对齐问题
- 15 全局变量和局部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道的?
- 16 简述C、C++程序编译的内存分配情况
- 17 简述strcpy、sprintf 与memcpy 的区别
- 18 请解析(\*(void (\*) ( ) )0)( )的含义
- 19 C语言的指针和引用和c++的有什么区别?
- 20 typedef 和define 有什么区别
- 21 指针常量与常量指针区别
- 22 简述队列和栈的异同
- 42 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的