复习必背c.docx

上传人:b****3 文档编号:26512815 上传时间:2023-06-20 格式:DOCX 页数:11 大小:21.63KB
下载 相关 举报
复习必背c.docx_第1页
第1页 / 共11页
复习必背c.docx_第2页
第2页 / 共11页
复习必背c.docx_第3页
第3页 / 共11页
复习必背c.docx_第4页
第4页 / 共11页
复习必背c.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

复习必背c.docx

《复习必背c.docx》由会员分享,可在线阅读,更多相关《复习必背c.docx(11页珍藏版)》请在冰豆网上搜索。

复习必背c.docx

复习必背c

C++(面向对象的程序设计)考前必背的名词解释和简答题 

1. 封装 封装是将数据和代码捆绑到一起,避免了外界的干扰和不确定性。

例如 C++中的 类,它定义了该集合中每个对象所共有的属性和方法。

  

2. 继承 继承是让某个类型的对象获得另一个类型的对象的特征。

例如:

C++中子类对父 类的继承,子类具有父类的特性,同时还可以拥有自己的新特性。

  

3. 多态 多态是指不同类型的对象接收相同的消息时产生不同的行为。

 多态机制使具有不 同内部结构的对象可以共享相同的外部接口,通过这种方式减小代码的复杂度。

 例如函数的重载。

  

4. 什么是 this 指针?

为什么要用 this 指针?

  

this 指针是类中的一个特殊指针,当类实例化时,this 指针指向对象自己;而 在类的声明时,指向类本身。

通过它不仅可以提升成员函数操作的效率,而且能 简化运算符重载代码。

  5. 叙述公有、私有、保护成员在类中、类外和对象中的访问权限。

 类中的关键字 public, private, protected 声明了类中的成员与类外之间的关 系,称为访问权限 。

 对于 public 成员来说,他们是公有的,可以在类外和对象中访问。

 对于 private 成员来说,他们是私有的,不能在类外和对象中访问,数据成员只 能由类中的函数使用,成员函数只允许在类中调用。

 对于 protected 成员来说,他们是受保护的,具有半公开性质,可以在类中与子 类中访问。

  

6. 构造函数和析构函数的作用是什么?

  

构造函数的功能是在创建对象时,给数据成员赋初值,即给对象初始化。

 析构函数的功能是释放一个对象,在对象删除前,用来做一些内存释放等清理工 作。

  7. 什么是类的继承和派生?

  

继承是指一个事物可以继承其父辈全部或部分的特性, 同时本身还有自己的特性。

 当一个新类从一个已定义的类中派生后,新类不仅继承了原有类的属性和方法, 并且还拥有自己新的属性和方法,称为类的继承和派生。

  8. 派生类 public 继承方式有那些特点?

 

 

(1) 在派生类中, 基类的公有成员、 保护成员和私有成员的访问属性保持不变。

 在派生类中,基类的私有成员是无法访问的,虽然基类的私有成员被派生类继承了。

  

(2)派生类对象只能访问派生类和基类的公有成员。

  9. 派生类 protected 继承方式有那些特点?

  

(1)在派生类中,基类的公有成员、保护成员的访问属性都变成了保护的。

  

(2)在保护继承方式下,派生类中仍可以访问基类的公有成员和保护成员,但 基类的私有成员是无法访问的。

  

(3)派生类对象只能访问派生类的公有成员,不能访问基类的任何成员。

  10. 派生类 private 继承方式有那些特点?

  

(1)在派生类中,基类的公有成员、保护成员和私有成员的访问属性都将变成 私有的。

  

(2)私有继承方式下,派生类中仍可以访问基类的公有成员和保护成员,但基 类的私有成员是无法访问的。

  

(3)派生类对象只能访问派生类的公有成员,不能访问基类的任何成员。

  11. 在定义派生类的过程中,如何对基类的数据成员进行初始化?

  

通过调用基类的构造函数来设定基类的数据成员的初值。

 格式为 <派生类名>(形参表) :

基类 1(参数表) ,基类 2(参数表)…对象成员 1(参数表) ,对象成员 2(参数表)…{}  12. 什么是虚基类?

它的作用是什么?

  

虚基类是指在派生类中指定的基类是虚继承的方式。

 使用虚基类的目的是在多重派生中使用共有基类时, 在派生类中只有一个拷贝从 而解决有多个基类拷贝所产生的二义性问题。

  13. 在函数调用过程中,什么是赋值传递,什么是引用传递?

  

赋值传递是将实参赋值给形参变量, 然后执行被调函数体。

 赋值传递有两种形式, 一是直接传常量或变量值,二是传变量的地址。

 引用传递是将形参引用给形参,需要形参与实参指的是同一变量。

  

14. #include  和 #include “filename.h” 有什么区别?

 对于#include  ,编译器从标准库路径开始搜索 filename.h。

 对于#include “filename.h” , 编译器从用户的工作路径开始搜索 filename.h。

 15. const 有什么用途?

(请至少说明两种)  

(1)可以定义 const 常量  

(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。

被 const 修饰 的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

  16. 类的指针成员为什么要用 new 另辟内存空间?

  

为了保证类的封装性, 类中的指针成员所指向的内存空间必须在类的定义中自行独立开辟和释放。

一、填空 

1.在类中必须声明成员函数的   原型    ,成员函数的   实现  部分可以写在类外。

 

2.如果需要在被调函数运行期间,改变主调函数中实参变量的值,则函数的形参应该是    引用     类型或     指针      类型。

 3.   抽象      类只能作为基类使用,而不能声明它的对象。

 4.进行函数重载时,被重载的同名函数如果都没有用const修饰,则它们的形参   个数   或   类型   必须不同。

 

5.通过一个  常  对象只能调用它的常成员函数,不能调用其他成员函数。

 

6.函数的递归调用是指函数直接或间接地调用      自身    。

 7.拷贝构造函数的形参必须是     本类对象的引用    。

 一、单项选择题(每小题2分,共40分) 

1、关于C++与C语言关系的描述中,(  D  )是错误的。

 

 A.C语言是C++语言的一个子集       B.C语言与C++语言是兼容的  C.C++语言对C语言进行了一些改进   D.C++语言和C语言都是面向对象的 2、已知:

int m=10; 下列表示引用的方法中,( A   )是正确的。

 

A.int &x=m;     B.int &y=10;      C.int &z;       D.float &t=&m; 3、考虑下面的函数原型声明:

void testDefaulParam(int a,int b=7,char z='*'); 下面函数调用中,不合法的是( C   )。

 

A.testDefaulParam(5);          B.testDefaulParam(5,8); C.testDefaulParam(5,'#');        D.testDefaulParam(0,0,'*'); 

4、系统在调用重载函数时往往根据一些条件确定哪个重载函数被调用,在下列选项中,不能作为依据的是( A   )。

 

A.函数的返回值类型    B.参数的类型    C.函数名称    D.参数个数 5、下列有关C++类的说法中,不正确的是(  D   )。

 

A.类是一种用户自定义的数据类型 

B.只有类中的成员函数或类的友元函数才能存取类中的私有成员 C.在类中,如果不做特别说明,所有成员的访问权限均为私有的 D.在类中,如果不做特别说明,所有成员的访问权限均为公用的 

6、已知X类,则当程序执行到语句X array[3];时,调用了( D   )次构造函数。

 A.0           B.1           C.2            D.37、有关析构函数的说法,不正确的是(  B  )。

 A.析构函数有且仅有一个 

B.析构函数和构造函数一样可以有形参 

C.析构函数的功能是在系统释放对象之前作一些内存清理工作 D.析构函数无任何函数类型 

8、类定义的内容允许被其对象无限制地存取的是(   C  )。

 

A.private 部分   B. protected 部分   C.public 部分    D.以上都不对 9、关于常数据成员的说法,不正确的是(     )。

 

A.常数据成员的定义形式与一般常变量的定义形式相同,只不过常数据成员的定义必须出现在类体中 

B.常数据成员必须进行初始化,并且不能被更新 C.常数据成员通过构造函数的成员初始化列表进行初始化 D.常数据成员可以在定义时直接初始化 

10、运用运算符delete删除一个动态对象时(    )。

 

A.系统首先为该动态对象调用构造函数,再释放其占用的内存 B.系统首先释放该动态对象占用的内存,再为其调用构造函数 C.系统首先为该动态对象调用析构函数,再释放其占用的内存 D.系统首先释放动态对象占用的内存,再为其调用析构函数 

11、可以在类外用p.a的形式访问派生类对象p的基类成员a,其中a是( D   )。

 A.私有继承的公用成员        B.公用继承的私有成员 C.公用继承的保护成员        D.公用继承的公用成员 

12、在公用继承方式下,有关派生类对象和基类对象的关系,不正确的叙述是(  )。

 A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用 C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 13、设置虚基类的目的是( B  )。

 

5、类的静态成员分为                     和                     。

 6、运算符重载要求保持其原来的操作数个数、           、              和语法结构。

 

7、通过关键字         可以声明模板,通过关键字           指定函数模板的类型参数,有几个类型参数就有几个类型关键字。

 

8、列出C++中两种用户自定义的数据类型:

           、           。

 9、构造函数的作用是                                                  。

 10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为           。

A.简化程序     B.消除二义性    C.提高运行效率   D.减少目标代码 14、在C++中,用于实现动态多态性的是( D   )。

 

A.内联函数     B.重载函数      C.模板函数       D.虚函数 15、不能说明为虚函数的是(    )。

 

A.析构函数     B.构造函数      C.类的成员函数   D.以上都不对 16、如果一个类至少有一个纯虚函数,那么就称该类为(     )。

 

A.抽象类       B.派生类        C.纯基类         D.以上都不对 17、下面关于友元的描述中,错误的是(     )。

 A.友元函数可以访问该类的私有数据成员 

B.一个类的友元类中的成员函数都是这个类的友元函数 C.友元可以提高程序的运行效率 D.类与类之间的友元关系可以继承 

18、下列运算符中,(    )运算符在C++中不能被重载。

 

A.&&           B.[]             C.:

:

           D.new 

19、模板的使用实际上是将类模板实例化成一个(    )。

 

A.函数          B.对象           C.类         D.抽象类

 20、假定MyClass为一个类,则该类的拷贝构造函数的声明语句为(    )。

 A.MyClass(MyClass x)          B.MyClass&(MyClass x) C.MyClass(MyClass &x)         D.MyClass(MyClass *x) 

二、填空题(前16个空,每空1分,后2个空,每空2分,共20分) 

1、类和对象的关系可表述为:

类是对象的         ,而对象则是类的         。

 2、在C++中,三种继承方式的说明符号为            、         和          ,如果不加说明,则默认的继承方式为           。

 

3、如果只想保留公共基类的一个复制,就必须使用关键字         把这个公共基类声明为虚基类。

 

4、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语句     

 5、类的静态成员分为                     和                     。

 6、运算符重载要求保持其原来的操作数个数、           、              和语法结构。

 

7、通过关键字         可以声明模板,通过关键字           指定函数模板的类型参数,有几个类型参数就有几个类型关键字。

 

8、列出C++中两种用户自定义的数据类型:

           、           。

 9、构造函数的作用是                                                  。

 10、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为            

一、单项选择题(每小题2分,共40分) 

1-5.D A C A D           6-10.D B C D C  11-15.D C B D B          16-20.A D C C C 

二、填空题(前16个空,每空1分,后2个空,每空2分,共20分) 

1.        抽象                   、         实例                      2.     public        、   private   _ ___、    protected    、   private _ ___ 3.         virtual           ___     4.    friend void fun(A &a)           _ 5.  静态数据成员  、  静态成员函数   6.   结合性    、    优先级_ ___ 7.  Template  、 class(或typename)   8.      类     、    结构体 __

  简单解释什么是面向对象程序设计的封装性。

 

答:

对象是一个封装体,在其中封装了该对象所具有的属性和操作。

对象作为独立的基本单元,实现了将数据和数据处理相结合的思想。

此外,封装特性还体现在可以限制对象中数据和操作的访问权限,从而将属性“隐藏”在对象内部,对外只呈现一定的外部特性和功能。

封装性增加了对象的独立性,C++通过建立数据类型——类,来支持封装和数据隐藏。

一个定义完好的类一旦建立,就可看成完全的封装体,作为一个整体单元使用,用户不需要知道这个类是如何工作的,而只需要知道如何使用就行。

另一方面,封装增加了数据的可靠性,保护类中的数据不被类以外的程序随意使用。

这两个优点十分有利于程序的调试和维护。

  

4.2.2  C++编译器怎样对标识符进行解析?

 

答:

编译器对标识符的解析分两步,第一步查找在声明中用到的标识符,特别是函数成员声明中用到的参数类型,第二步是函数成员体内的标识符。

  

4.2.3  为什么说类与对象的概念是客观世界的反映?

 答:

客观世界的事物都具有某些属性和行为(或操作),具有相同属性和行为的事物可以归属于一类,用分类的方法可以提高认识事物的效率。

C++中定义的类则是通过抽象的方法将某一类事物共有的静态特征(属性)和动态特征(行为)概括出来并加以描述,而对象是类的具体实现,所以说类与对象的概念是客观世界的反映。

  

4.2.4  什么叫类域?

为什么说类域是抽象的?

 

答:

类域是类体所包括的范围。

每个类定义都引入了一个独立的类域,在类域中说明的标识符仅在该类的类域中有效。

由于类只是一个说明,看上去有数据,有函数,有类型定义,但是它并非实体,不分配内存,当然也不能运行。

所以说类域是抽象的。

  

4.2.5  引用作为函数参数时为什么能实现两个实参之间的数据交换?

为什么对应实参不能为引用?

为什么返回值为引用的函数可以作为左值?

 

答:

引用变量是其关联变量的别名,二者在内存中占据同一个存储单元。

在一个以引用作为参数的函数中,交换两个参数的值,实际上就是交换两个实参的值。

如果函数的参数是引用,调用时需要取得实参的地址,而实参如果已经是一个地址,再进行引用将产生错误,故对应实参不能为引用。

 

函数返回引用实际是指明(返回)了相应的关联变量,所以声明返回值为引用的函数实际上是将关联变量作为左值参与运算。

 

4.2.6  什么是缺省的构造函数?

缺省的构造函数最多可以有多少个?

 

答:

如果在类定义中不显式地定义构造函数,C++编译器会自动产生一个缺省的构造函数,不过该函数不做具体的初始化工作。

只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数。

缺省的构造函数只能有一个。

  

4.2.7  拷贝构造函数用于哪三个方面?

 答:

 

(1) 用类的一个对象去初始化该类的另一个对象时使用。

 

(2) 当函数的形参是类的对象,调用函数时,进行形参与实参结合时使用。

 (3) 当函数的返回值是类对象,函数执行结束返回调用者时使用。

  

4.2.8  写出含有对象成员的类的构造函数的格式,并做简单说明。

 答:

C++中对含对象成员的类对象的构造函数有固定的格式:

 

类名:

:

构造函数名(参数总表):

对象成员1(参数名表1),对象成员2(参数名表2),……对象成员n(参数名表n){……}号后用逗号隔开的是要初始化的对象成员,附在后面的参数名表1,…,参数名表n依次为调用相应对象成员所属的构造函数时的实参表。

这些表中的参数通常来自冒号前的参数总表,但没有类型名。

  

4.2.9  所有类对象未重载的赋值运算符“=”是怎样工作的?

为什么它可以进行连续赋值?

 答:

对所有的类对象,未重载的赋值运算符“ =”称作缺省的按成员拷贝赋值操作符,同类对象之间可以用“=”直接拷贝。

因为缺省的赋值操作返回一个对象的引用,所以它可以进行连续赋值。

  

  为什么在友元函数的函数体内访问对象成员时,必须用对象名加运算符“.”再加对象成员名?

 

答:

友元函数不是类的成员函数,在函数体中访问对象的成员,必须用对象名加运算符“.”加对象成员名。

这一点和一般函数一样。

  

  重载复数运算符+时,采用下面友元函数声明:

 

friend Complex operator+(Complex &c1,Complex &c2); 

为什么不能用于“实数+复数”?

怎样改进才能适用?

为什么?

 

答:

使用引用类型变量作为运算符重载函数的参数,身为左值的实数类型实参不能被转换为复数,编译时无法通过。

添加const说明,使实数到复数的转换隐式地在一份拷贝上进行,则可以实现“实数+复数”运算。

修改后的说明为:

   friend Complex operator+(const Complex &c1, const Complex &c2);  

  类的静态数据成员与函数中的静态成员有何异同?

 答:

类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用内存中,为该类所有对象公用。

函数中的静态变量也位于公用内存中,不随函数调用而重新分配,所以总是保留上次进入并执行该函数后留下的信息。

  

  C++中结构、联合与类三者间有何异同?

 

答:

在C++中结构(structure)与类几乎是完全一样的类型,差别仅仅在于缺省情况下结构的成员为公有的。

联合(union)是C++的导出数据类型,在语法与功能上类似于结构,二者的区别是:

结构变量的各成员同时被分配了各自独立的内存区,而联合变量的各个成员的存储开始地址都相同,所以在任一时刻联合变量只能存储一个成员。

  

  对象的第一特征是封装,那么由对象组成的面向对象的程序怎样建立各对象之间的有效联系?

面向对象程序的组织与面向过程有什么不同?

 答:

因为对象的操作主要用来响应外来消息并为其他对象提供服务,所以面向对象的程序利用消息传递机制来建立各对象之间的有效联系,协调各对象的运行。

一个对象可以向其他对象发送消息以请求服务,也可以响应其他对象传来的消息,完成自身固有的某些操作,从而服务于其他对象。

  面向过程的程序是模块化的,模块的组织具有分层结构特点,层与层之间是调用关系。

面向对象程序是由一个个封装的对象组成,而对象是由紧密结合在一起的算法和数据结构组成。

对象之间是相互请求和相互协作的关系。

1、类和对象的关系可表述为:

类是对象的        ,而对象则是类的        。

 

2、静态成员函数没有隐含的         ,所以,在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。

 

3、在图1中,A,B,C,D,E,F均是类,其中属于单继承的派生类有        ,属于多继承的派生类有        ,类F的基类有           ,类A的派生类有             。

 

4、如果只想保留公共基类的一个复制,就必须使用关键字           把这个公共基类声明为虚基类。

 

5、从实现的角度来讲,多态性可以划分为两类:

             和             。

 6、如果一个类包含一个或多个纯虚函数,则该类称为                。

 

7、若要把void fun()定义为类A的友元函数,则应在类A的定义中加入语句               。

 

8、列出C++中的两种代码复用方式:

                和                。

 9、析构函数的作用是                                                    。

 10、假定A是一个类名,则该类的拷贝构造函数的原型说明语句为:

            。

 11、后置自增运算符“++”重载为类的成员函数(设类名为A)的形式为:

        

  二、填空题(前14个空,每空1分,后3个空,每空2分,共20分) 1.      抽象              实例       2.           this指针            3.       E               D、F           A、B、C、D、E         D、F      4.          virtual                   5.  静态多态性       动态多态性  6.            抽象类                   7.        friend void fun(A &a)       8.      继承           组合或模板   

9.   在对象被系统释放之前做一些内存清理工作                              10.   A(const A&)                     11.    A operator++(int)  

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1