常见C++面试题与答案解析

上传人:爬*** 文档编号:126355683 上传时间:2020-03-24 格式:PDF 页数:26 大小:1.05MB
返回 下载 相关 举报
常见C++面试题与答案解析_第1页
第1页 / 共26页
常见C++面试题与答案解析_第2页
第2页 / 共26页
常见C++面试题与答案解析_第3页
第3页 / 共26页
常见C++面试题与答案解析_第4页
第4页 / 共26页
常见C++面试题与答案解析_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《常见C++面试题与答案解析》由会员分享,可在线阅读,更多相关《常见C++面试题与答案解析(26页珍藏版)》请在金锄头文库上搜索。

1、 C C 经典面试题 面试题 1 变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义 不分配地址的称为声明 一个变量可以在多个地方声明 但是只在一个地方定义 加入 extern 修饰的是变量的声明 说明此变量将在文件以外或在文件后面部分 定义 说明 很多时候一个变量 只是声明不分配内存空间 直到具体使用时才初始化 分配内存空间 如外部变量 面试题 2 写出 bool int float 指针变量与 零值 比较的 if 语句 bool 型数据 if flag A else B int 型数据 if 0 flag A else B 指针型数 if NULL flag A else B

2、float 型数据 if flag NORM int ptr int printf d d a 1 ptr 1 return 输出结果 2 5 注意 数组名 a 可以作数组的首地址 而 改为 int ptr int a 1 时输出结果将是什么呢 面试题 9 简述 C C 程序编译的内存分配情况 C C 中内存分配方式可以分为三种 1 从静态存储区域分配 内存在程序编译时就已经分配好 这块内存在程序的整个运行期间都存在 速度快 不容易出错 因为有系统会善后 例如全局变量 static 变量等 2 在栈上分配 在执行函数时 函数内局部变量的存储单元都在栈上创建 函数执行结束时这些存储单元自动被释

3、放 栈内存分配运算内置于处理器的指令集中 效率很高 但是分配的内存容量有限 3 从堆上分配 即动态内存分配 程序在运行的时候用 malloc 或 new 申请任意大小的内存 程序员自己负责在何 时用 free 或 delete 释放内存 动态内存的生存期由程序员决定 使用非常灵活 如果在堆上分配了空间 就有责任回收它 否则运行的程序会出现内存泄漏 另外频繁地分配和释放不同大小的堆空间将会产生 堆内碎块 一个 C C 程序编译时内存分为 5 大存储区 堆区 栈区 全局区 文字常量区 程序代码区 volatile 告诉编译器i是随时可能发生变 化的 每次使用它的时候必须从i的地 址中读取 对数组名

4、取地址为 二级指针 即数组 的指针 4 面试题 10 简述 strcpy sprintf 与 memcpy 的区别 三者主要有以下不同之处 1 操作对象不同 strcpy 的两个操作对象均为字符串 sprintf 的操作源对象可以是多种数据类型 目的操作对象是字符串 memcpy 的两个对象就是两个任意可操作的内存地址 并不限于何种数据类型 2 执行效率不同 memcpy 最高 strcpy 次之 sprintf 的效率最低 3 实现功能不同 strcpy 主要实现字符串变量间的拷贝 sprintf 主要实现其他数据类型格式到字 符串的转化 memcpy 主要是内存块间的拷贝 说明 strcp

5、y sprintf 与 memcpy都可以实现拷贝的功能 但是针对的对象不同 根据实际需求 来 选择合适的函数实现拷贝功能 面试题 11 设置地址为 0 x67a9 的整型变量的值为 0 xaa66 int ptr ptr int 0 x67a9 ptr 0 xaa66 说明 这道题就是强制类型转换的典型例子 无论在什么平台地址长度和整型数据的长度是一样的 即一个整型数据可以强制转换成地址指针类型 只要有意义即可 面试题 12 面向对象的三大特征 面向对象的三大特征是封装性 继承性和多态性 封装性 将客观事物抽象成类 每个类对自身的数据和方法实行 protection private prot

6、ected public 继承性 广义的继承有三种实现形式 实现继承 使用基类的属性和方法而无需额外编码的能力 可 视继承 子窗体使用父窗体的外观和实现代码 接口继承 仅使用属性和方法 实现滞后到子类实现 多态性 是将父类对象设置成为和一个或更多它的子对象相等的技术 用子类对象给父类对象赋值 之后 父类对象就可以根据当前赋值给它的子对象的特性以不同的方式运作 说明 面向对象的三个特征是实现面向对象技术的关键 每一个特征的相关技术都非常的复杂 程 序员应该多看 多练 面试题 13 C 的空类有哪些成员函数 缺省构造函数 缺省拷贝构造函数 缺省析构函数 缺省赋值运算符 缺省取址运算符 缺省取址运算

7、符 const 注意 有些书上只是简单的介绍了前四个函数 没有提及后面这两个函数 但后面这两个函数也是 空类的默认函数 另外需要注意的是 只有当实际使用这些函数的时候 编译器才会去定义它们 一个整形数据可以 强制转换成地址指 针类型 缺省的取地址运算符 5 面试题 14 谈谈你对拷贝构造函数和赋值运算符的认识 拷贝构造函数和赋值运算符重载有以下两个不同之处 1 拷贝构造函数生成新的类对象 而赋值运算符不能 2 由于拷贝构造函数是直接构造一个新的类对象 所以在初始化这个对象之前不用检验源对象 是否和新建对象相同 而赋值运算符则需要这个操作 另外赋值运算中如果原来的对象中有内存分配要 先把内存释放

8、掉 注意 当有类中有指针类型的成员变量时 一定要重写拷贝构造函数和赋值运算符 不要使用默认 的 面试题 15 用 C 设计一个不能被继承的类 template class A friend T private A A class B virtual public A public B B class C virtual public B public C C void main void B b C c return 注意 构造函数是继承实现的关键 每次子类对象构造时 首先调用的是父类的构造函数 然后才 是自己的 面试题 16 访问基类的私有虚函数 写出以下程序的输出结果 include cl

9、ass A 6 virtual void g cout A g endl private virtual void f cout A f endl class B public A void g cout B g endl virtual void h cout B h endl typedef void Fun void void main B b Fun pFun for int i 0 i next 记录上次翻转后的链表 oldList next newHead 将当前结点插入到翻转后链表的开头 newHead oldList 递归处理剩余的链表 return next NULL new

10、Head reverse t newHead 说明 循环算法就是图 10 2 图 10 5 的移动过程 比较好理解和想到 递归算法的设计虽有一点难 度 但是理解了循环算法 再设计递归算法就简单多了 面试题 21 简述队列和栈的异同 队列和栈都是线性存储结构 但是两者的插入和删除数据的操作不同 队列是 先进先出 栈是 后进先出 注意 区别栈区和堆区 堆区的存取是 顺序随意 而栈区是 后进先出 栈由编译器自动分 配释放 存放函数的参数值 局部变量的值等 其操作方式类似于数据结构中的栈 堆一般由程序员 分配释放 若程序员不释放 程序结束时可能由 OS 回收 分配方式类似于链表 它与本题中的堆和栈是两

11、回事 堆栈只是一种数据结构 而堆区和栈区是程序的不同内存存储区域 面试题 22 能否用两个栈实现一个队列的功能 结点结构体 typedef struct node int data node next node LinkStack 创建空栈 LinkStack CreateNULLStack LinkStack 申请新结点 if NULL S printf Fail to malloc a new node n 9 return NULL S data 0 初始化新结点 S next NULL return S 栈的插入函数 LinkStack Push LinkStack return NU

12、LL LinkStack p NULL p LinkStack malloc sizeof node 申请新结点 if NULL p printf Fail to malloc a new node n return S if NULL S next p next NULL else p next S next p data data 初始化新结点 S next p 插入新结点 return S 出栈函数 node Pop LinkStack temp data 0 temp next NULL if NULL S 检验栈 printf There no node in stack retur

13、n temp temp S 10 if S next NULL printf The stack is NULL can t pop n return temp LinkStack p S next 节点出栈 S next S next next temp p free p p NULL return temp 双栈实现队列的入队函数 LinkStack StackToQueuPush LinkStack LinkStack S1 NULL CreateNULLStack S1 创建空栈 while NULL S next S 出栈入 S1 n Pop S Push S1 n data Pus

14、h S1 data 新结点入栈 while NULL S1 next S1 出栈入 S n Pop S1 Push S n data return S 说明 用两个栈能够实现一个队列的功能 那用两个队列能否实现一个队列的功能呢 结果是否定 的 因为栈是先进后出 将两个栈连在一起 就是先进先出 而队列是现先进先出 无论多少个连在一 起都是先进先出 而无法实现先进后出 面试题 23 计算一颗二叉树的深度 深度的计算函数 int depth BiTree T if T return 0 判断当前结点是否为叶子结点 11 int d1 depth T lchild 求当前结点的左孩子树的深度 int

15、d2 depth T rchild 求当前结点的右孩子树的深度 return d1 d2 d1 d2 1 注意 根据二叉树的结构特点 很多算法都可以用递归算法来实现 面试题 24 编码实现直接插入排序 直接插入排序编程实现如下 include void main void int ARRAY 10 0 6 3 2 7 5 4 9 1 8 int i j for i 0 i 10 i cout ARRAY i cout endl for i 2 i 10 i 将 ARRAY 2 ARRAY n 依次按序插入 if ARRAY i ARRAY i 1 如果 ARRAY i 大于一切有序的数值 AR

16、RAY i 将保持原位不动 ARRAY 0 ARRAY i 将 ARRAY 0 看做是哨兵 是 ARRAY i 的副本 j i 1 do 从右向左在有序区 ARRAY 1 i 1 中 查找 ARRAY i 的插入位置 ARRAY j 1 ARRAY j 将数值大于 ARRAY i 记录后移 j while ARRAY 0 ARRAY j ARRAY j 1 ARRAY 0 ARRAY i 插入到正确的位置上 for i 0 i 10 i cout ARRAY i cout endl 12 注意 所有为简化边界条件而引入的附加结点 元素 均可称为哨兵 引入哨兵后使得查找循环条 件的时间大约减少了一半 对于记录数较大的文件节约的时间就相当可观 类似于排序这样使用频率非 常高的算法 要尽可能地减少其运行时间 所以不能把上述算法中的哨兵视为雕虫小技 面试题 25 编码实现冒泡排序 冒泡排序编程实现如下 include define LEN 10 数组长度 void main void int ARRAY 10 0 6 3 2 7 5 4 9 1 8 待排序数组 printf n for int

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号