经典C++笔试题目--100(C++面向对象的特性(38-61))

来源:互联网 发布:net4.0是什么软件 编辑:程序博客网 时间:2024/06/05 04:49


C++面向对象的特性(38-61)

38、是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态?

【参考答案】
virtual修饰符会被隐形继承的。virtual可加可不加。子类的空间里有父类的所有变量(static除外)。同一个函数只存在一个实体(inline除外)。子类覆盖它的函数不加virtual ,也能实现多态。在子类的空间里,有父类的私有变量。私有变量不能直接访问。


39、面向对象的三个基本特征,并简单叙述之?

【参考答案】                                                                     
1. 封装:将客观事物抽象成类,每个类对自身的数据和方法实行protection(private,protected,public)                  
2. 继承:广义的继承有三种实现形式:
实现继承(指使用基类的属性和方法而无需额外编码的能力)、
可视继承(子窗体使用父窗体的外观和实现代码)、
接口继承(仅使用属性和方法,实现滞后到子类实现)。
前两种(类继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。                                 
3. 多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。


40、重载(overload)、重写(override,有的书也叫做“覆盖”)、重定义(redefinition)的区别?

【标准答案】
重载   同一名字空间 是指允许存在多个同名函数,而这些函数的参数表不同。
重定义/隐藏 不同名字空间 用于继承,派生类与基类的函数同名,屏蔽基类的函数
重写/覆盖 不同名字空间用于继承,子类重新定义父类虚函数的方法


41、多态的作用?

【参考答案】
主要是两个:
1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。


42、当一个类A 中没有声命任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。

  【标准答案】
sizeof(A)= 1;


43、如果ClassA中定义并实现虚函数int func(void),ClassB中也实现该函数,那么上述变量a->func()将调用哪个类里面的函数?如果int func(void)不是虚函数,情况又如何?为什么?

【参考答案】
第一问调用的是B的。第二问调用A的。
虚函数的一个典型应用,虚函数只能借助于指针或者引用来达到多态的效果。


44、 C++里面是不是所有的动作都是main()引起的?如果不是,请举例。

【参考答案】
比如全局变量的初始化,就不是由main函数引起的。举例:        
 
class   A{};   A   a;   //a的构造函数限执行  int   main() {} 


45、 内联函数在编译时是否做参数类型检查

【参考答案】
内联函数要做参数类型检查,   这是内联函数跟宏相比的优势。
                                                                       

46、请讲一讲析构函数和虚函数的用法和作用? 

【参考答案】
析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。
 有适放内存空间的作用。
虚函数是C++多态的一种表现, 使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。

47、“new”in c++ is a:

  A. library function like malloc in c  B. key word     C. operator D. none of the above
【参考答案】C。
malloc是库函数,不在编译器控制范围之内;new是运算符,在编译器控制范围之内。   
调用malloc时,从堆中申请内存;调用new时,从堆中申请内存并为内存调用构造函数。


48、对于C++中类(class) 与结构(struct)的描述正确的为:

 A,类中的成员默认是private的,但是可以声明public,private 和protected,结构中定义的成员默认的都是public;
B,结构中不允许定义成员函数,但是类中可以定义成员函数;
C,结构实例使用malloc() 动态创建,类对象使用new 操作符动态分配内存;
D,结构和类对象都必须使用new 创建;
E,结构中不可以定义虚函数,但是类中可以定义虚函数.
F,结构不可以存在继承关系,但是类可以存在继承关系.
【标准答案】A,D


49、两个互相独立的类:ClassA 和 ClassB,都各自定义了非静态的公有成员函数 PublicFunc() 和非静态的私有成员函数 PrivateFunc();现在要在ClassA 中增加定义一个成员函数ClassA::AdditionalPunction(ClassA a,ClassB b);则可以在AdditionalPunction(ClassA x,ClassB y)的实现部分(函数功能体内部)出现的合法的表达是最全的是: 

A,x.PrivateFunc();x.PublicFunc();y.PrivateFunc();y.PublicFunc();
B,x.PrivateFunc();x.PublicFunc();y.PublicFunc();
C,x.PrivateFunc();y.PrivateFunc();y.PublicFunc();
D,x.PublicFunc();y.PublicFunc();
【标准答案】B


50、C++程序下列说法正确的有:

A,对调用的虚函数和模板类都进行迟后编译.
B,基类与子类中函数如果要构成虚函数,除了要求在基  类中用virtual 声名,而且必须名字相同且参数类型相同返回类型相同。
  C,重载的类成员函数都必须要:或者返回类型不同,或者参数数目不同,或者参数序列的类型不同.
D,静态成员函数和内联函数不能是虚函数,友员函数和构造函数也不能是虚函数,但是析构函数可以是虚函数.
【标准答案】A


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、函数模板与类模板有什么区别?

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


58、请你谈谈你在类中如何使用const的。

【参考答案】

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

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

const 数据成员的初始化只能在类构造函数的初始化表中进行。


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

【参考答案】
如果同名函数的参数不同(包括类型、顺序不同) ,那么容易区别出它们是不同的。如果同名函数仅仅是返回值类型不同,有时可以区分,有时却不能。例如: 
void Function(void); 
int  Function (void); 
上述两个函数,第一个没有返回值,第二个的返回值是 int 类型。如果这样调用函数: 
int  x = Function (); 
则可以判断出 Function 是第二个函数。问题是在 C++/C 程序中,我们可以忽略函数的返回值。在这种情况下,编译器和程序员都不知道哪个 Function 函数被调用。所以只能靠参数而不能靠返回值类型的不同来区分重载函数。


60、所有的运算符都能重载吗?

【参考答案】
不能被重载的运算符 
在 C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。 
(1)不能改变 C++内部数据类型(如 int,float 等)的运算符。 
(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。 
(3)不能重载目前 C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。 
  (4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。 


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

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






0 0
原创粉丝点击