C++经典面试题(二)

最近看一些面试题,觉得如果自己被问到了,并不能很利落的回答出来。

一是从来没有这个意识,二是没有认真的梳理下。

下面对这些题做出分析,哈!个人能力有限,其中难免有疏漏,欢迎大家补充咯!

11.引用与指针有什么区别?

【参考答案】

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针。

可以参考下 在 5 题中补充的内容

12.C++中virtual与inline的含义分别是什么?

【参考答案】

在基类成员函数的声明前加上virtual关键字,意味着将该成员函数声明为虚函数。

inline与函数的定义体放在一起,使该函数称为内联。

inline是一种用于实现的关键字,而不是用于声明的关键字。 

虚函数的特点;如果希望派生类能够重新定义基类的方法,则在基类中将该方法定义为虚方法,这样可以启用动态联编。 

内联函数的特点;使用内联函数的目的是为了提高函数的运行效率。内联函数体的代码不能过长,因为内联函数省去调用函数的时间是以代码膨胀为代价的。内联函数不能包含循环语句,因为执行循环语句要比调用函数的开销大。

哈!我想我确实要注意一下表达能力。。

13.

VC中,编译工具条内的Debug与Release选项是什么含义?

【参考答案】

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

Debug带有大量的调试代码,运行时需要相应的运行库,

发布模式程序紧凑不含有调试代码和信息,直接可以运行(如果不需要运行库)

14.函数assert的用法?

【参考答案】断言assert是仅在debug版本起作用的宏,用于检查“不应该“发生的情况。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段

学VC++的时候见过assert宏定义,但是自己从来没用过。。。

15.const  与 #define 的比较 ,const有什么优点?

【参考答案】

(1) const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应) 。

#define不能生成 类的专属常量,因为它只是进行简单的替换。。

(2)  有些集成化的调试工具可以对 const 常量进行调试,但是不能对宏常量进行调试。

《Effective C++》中建议以const、enum、inline代替#define。

使用enum的原因

有些情况下,编译器不允许静态常量出现在类的初始设定中,只得以enum的形式

另一方面,enum和#define更相似,它们都没有具体的类型,比如,有const int a; 却没有 #define N int a,enum和#define都不能够被去地址,而const可以。

16.请你谈谈引用和指针的区别。

【参考答案】

(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。

(2)不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL) 。

(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 。

不断地出现,可见这个问题是经常容易被问到的。

17.

有了 malloc/free 为什么还要 new/delete  ?

【参考答案】

malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请动态内存和释放内存。

对于非内部数据类型的对象而言,光用 malloc/free 无法满足动态对象的要求。

对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。

由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free。

因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符 new,以及一个能完成清理与释放内存工作的运算符 delete。注意 new/delete 不是库函数。

以前只是习惯在用C时用malloc/free,用C++时用new/delete,没注意到这些差异性。

18.如果在申请动态内存时找不到足够大的内存块,malloc 和 new 将返回 NULL 指针,宣告内存申请失败。你是怎么处理内存耗尽的?

【参考答案】

(1)判断指针是否为 NULL,如果是则马上用 return 语句终止本函数。

(2)判断指针是否为 NULL,如果是则马上用 exit(1)终止整个程序的运行

(3)为 new 和 malloc 设置异常处理函数。例如 Visual C++可以用_set_new_hander 函数为 new 设置用户自己定义的异常处理函数,也可以让 malloc 享用与 new 相同的异常处理函数。

我一般是直接return 了

19.C++是不是类型安全的?

【参考答案】不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。

20. const 符号常量;

(1)const char *p

(2)char const *p (

3)char * const p

说明上面三种描述的区别;

【参考答案】

(1)p是一个指向const char的指针,p是可以改变指向的,但是p指向的值是不能改变的;

(2)p指向的恰好是一个指向const的char的普通指针;

(3)p是一个指针,这个指针是指向char的const指针。

(1)和(2)的定义是一样的。

1、2和3的区别在于,1和2的const出现在*号左边,3出现在*号右边。好像也是在《C和指针》上看到的这句话。

未完。。。待续(*^_v_^*)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-13 01:59:31

C++经典面试题(二)的相关文章

菜鸟系列之C/C++经典试题(二)

求子数组的最大和 题目描述: 输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4,7, 2,因此输出为该子数组的和18. 这个问题在各大公司面试中出现频率之频繁,被人引用次数之多,非一般面试题可与之匹敌.ok,下面,咱们来一步一步分析这个题. 分析与解法 解法一 求一个数组的最大子数组和

【转】嵌入式软件工程师经典笔试题

嵌入式软件工程师经典笔试题 > 预处理器(Preprocessor) 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 我在这想看到几件事情: 1). #define 语法的基本知识(例如:不能以分号结束,括号的使用,等等) 2). 懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中 有多少秒而不是计算出实际的值,是更清晰而没有代价的. 3).

Linux 经典面试题

[Linux  经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文件用 i节点 来标识. 4. 全部磁盘块由四个部分组成,分别为引导块 .专用块 . i节点表块 和数据存储块. 5. 链接分为: 硬链接 和 符号链接 . 6. 超级块包含了i节点表 和 空闲块表 等重要的文件系统信息. 7. 某文件的权限为:d-rw-_r--_r--,用数值形式表示该权限,则该八

【转】.net 经典面试题

[转].net 经典面试题 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 在同一命名空间内可以访问. 2 .列举ASP.NET 页面之间传递值的几种方式. 答. 1.使用QueryString, 如....?id=1; response.

50个C/C++经典面试题

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

经典面试题回答——学习Java基础的目的

本系列知识解释:相信每一个学习Java的人都是从JavaSE开始的,也就是Java基础开始.但是却并不清楚学习Java基础到底有什么用? 首先我来回答这个问题,学习Java基础是有两个目的: 一.掌握基本的Java语言底层编码方法,同时掌握Java这门语言的编程思想,为了后期学习JavaEE打下基础,要不然在学习JavaEE的时候,连封装,继承,多态都不懂,那就实在是没法说了(相信在传智播客学习过Java基础的同学,这些都不是问题.) 二.在学习完JavaSE和JavaEE后招工作的时候能够答上

mysql经典面试题

mysql 经典面试题 (2011-10-26 17:13:38) 转载▼ 标签: 杂谈 分类: 日志 1.用两种方式根据部门号从高到低,工资从低到高列出每个员工的信息. employee: eid,ename,salary,deptid; select * from employee order by deptid desc,salary 2.列出各个部门中工资高于本部门的平均工资的员工数和部门号,并按部门号排序 创建表: mysql> create table employee921(id

MySQL20个经典面试题

MySQL20个经典面试题 Part2:经典题目 1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.MySQL中myisam与innodb的区别,至少5点 (1).问5点不同: (2).innodb引擎的4大特性 (3).2者selectcount(*)哪个更快,为什么 3.MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义 (1).varchar与char的区别 (2).varchar(50)中50的涵义 (3).int(20)中

C++经典面试题(五)

最近看一些面试题,觉得如果自己被问到了,并不能很利落的回答出来. 一是从来没有这个意识,二是没有认真的梳理下. 下面对这些题做出分析,哈!个人能力有限,其中难免有疏漏,欢迎大家补充咯! 41.多态的作用? [参考答案] 主要是两个: 1. 隐藏实现细节,使得代码能够模块化:扩展代码模块,实现代码重用: 2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用. 42.当一个类A 中没有声明任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解