C++经典面试题(六)

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

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

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

51.在C++中有没有纯虚构造函数?

【标准答案】构造函数不能是虚的。只能有虚的析构函数。

补充一句,有 纯虚的 析构函数

52.下面的 throw表达式哪些是错误的?

(a) class exceptionType { };

throw exceptionType { };

(b) enum mathErr { overflow, underflow, zeroDivide };

throw zeroDivide();

【标准答案】

(a) class exceptionType { };

throw exceptionType();

(b) enum mathErr { overflow, underflow, zeroDivide };

throw zeroDivide;

53.谈谈你是怎么认识c++中的模板的?

【参考答案】模板使程序员能够快速建立具有类型安全的类库集合和函数集合,它的实现,方便了大规模的软件开发。(结合STL更好)

54.在c++的一个类中声明一个static成员变量有没有用?

【参考答案】

在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,也就是说不管创建多少对象,static修饰的变量只占有一块内存。

其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。

static是加了访问控制的全局变量,不被继承。

55.C++中为什么用模板类。

【参考答案】

(1)可用来创建动态增长和减小的数据结构

(2)它是类型无关的,因此具有很高的可复用性。

(3)它在编译时而不是运行时检查数据类型,保证了类型安全

(4)它是平台无关的,可移植性

(5)可用于基本数据类型

56.函数模板与类模板有什么区别?

【参考答案】

函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定

57.请你谈谈你在类中如何使用const的。

【参考答案】

有时我们希望某些常量只在类中有效。由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现。

const 数据成员的确是存在的,但其含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。

不能在类声明中初始化 const 数据成员。const 数据成员的初始化只能在类构造函数的初始化表中进行。(注:static是在类的外部初始化)

感觉答案有些浅显,除了成员变量,成员函数会用const修饰、函数参数、函数返回值等。。

具体可参见
C++经典面试题(四) 和 《Effective C++》 这本著作

58.函数重载,我们靠什么来区分调用的那个函数?靠返回值判断可以不可以?

【参考答案】

如果同名函数的参数不同(包括类型、顺序不同) ,那么容易区别出它们是不同的。

如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如:

<span style="font-size:18px;">void Function(void);
int  Function (void); </span>

上述两个函数,第一个没有返回值,第二个的返回值是 int 类型。如果这样调用函数:

<span style="font-size:18px;">int  x = Function (); </span>

则可以判断出 Function 是第二个函数。

问题是在 C++/C 程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个 Function 函数被调用。

所以只能靠参数而不能靠返回值类型的不同来区分重载函数。

59.所有的运算符都能重载吗?

【参考答案】不能被重载的运算符

在 C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。 (1)不能改变 C++内部数据类型(如 int,float 等)的运算符。

(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。

(3)不能重载目前 C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。

(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。

以前在博客中总结过一次,除了“.”、“.*”、“::”、“?:”、“sizeof”,是C++明确规定不能重载的,其它如

“&&”、“||”等也是不建议重载的。

可参考博文
腾讯2015春招pc客户端开发练习卷 中的第2个题,其中给出了不能重载的具体原因

60.基类的析构函数不是虚函数,会带来什么问题?

【参考答案】派生类的析构函数用不上,会造成资源的泄漏。

这种情况下,只能析构对象的基类部分,造成所谓的“局部删除”,子类部分无法销毁,从而造成内存泄露

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

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

时间: 2024-10-25 01:37:05

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

Linux 经典面试题

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

.Net经典面试题

1.同一平台: 2.Bootstrap 3.webAPI 4.SignalR 5.ASP.Identity 6.OWIN 二. ObjectContext: 用于控制ASP的交易(Transaction),交易由Microsoft Transaction Server(MTS)管理 三.asp 是解释执行 asp.net是编译执行的 四.列举ASP.NET 页面之间传递值的几种方式. 答. 1.使用QueryString,  如....?id=1; response. Redirect()...

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

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

李洪强iOS经典面试题总结

iOS经典面试题总结--内存管理 我根据自己的情况做了一下总结,答案是我总结的,如有答的不好的地方,希望批评指正以及交流,谢谢! 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被创建时retain count+1,在对象被release时count-1,当count=0时,销毁对象.程序中加入autoreleasepool对象会由系统自动加上autorelease方法,如果该对象

【转】.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后招工作的时候能够答上

李洪强iOS经典面试题

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px "Helvetica Neue"; color: #333333; min-height: 20.0px } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px "Helvetica Neue"; color: #333333; background-color: #ffffff } p.p3 { margi

李洪强IOS开发之-iOS经典面试题

李洪强IOS开发之-iOS经典面试题 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人.所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充.我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这