最近看一些面试题,觉得如果自己被问到了,并不能很利落的回答出来。
一是从来没有这个意识,二是没有认真的梳理下。
下面对这些题做出分析,哈!个人能力有限,其中难免有疏漏,欢迎大家补充咯!
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_^*)
版权声明:本文为博主原创文章,未经博主允许不得转载。