C++简答题复习

更新时间:2023-11-08 12:50:02 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章 概述

1、简述C++的发展简况。

答:C++语言是从C语言发展而来的,C 语言是一种编译型的面向过程的程序设计语言,它最早是从英国剑桥大学一个名叫Martin Richards的学者在60年代开发的BCPL( 即Basic Combind Programming Language)语言的基础之上发展而来的。BCPL语言是Martin Richards在开发系统软件时,作为描述性语言而使用的一种程序设计语言。1970年,美国Bell实验室的 Ken?Thompson在软件开发工作中,继承和发展了BCPL语言的许多特点,进一步提出了一种叫“B语言”的语言。随后,在美国Bell实验室实现的更新型的小型机PDP-11的UNIX操作系统的研发工作中,于1972年推出了一种新型的程序语言 — C语言,该语言一经推出就在国际上广泛流行。20世纪80年代,由于软件工程的需要,面向对象程序设计方法在软件设计领域引起了普遍的重视,AT&T Bell实验室的计算机科学家Bjarne Stroustrup结合流行的C语言的所有成分,开发出了面向对象的程序设计语言C++。

2、C++语言有那些主要特点?

答: C ++ 语言具有以下主要特点:

(1) C++语言是一个中级的程序设计语言。 (2) C++是一个结构化的程序设计语言 。 (3) C++是一种面向对象的程序设计语言。 (4) C++语言是一个功能齐全的编程语言。 (5) C++语言是一种移植性很好的编程语言 。

3、 编写的C++语言的程序主要由那些基本组成部分构成? 答:C++语言的程序主要由以下几个基本组成部分构成:

(1) 预处理命令:C++语言提供了三类预处理命令:宏定义命令(define)、文件包含命令(include)、条件编译命令(if~else~endif),

(2) 输入/输出语句(Input/Output语句,简称I/O语句):C++语言的程序中总是少不了输入和输出的语句,实现与程序内部的信息交流。 (3) 函数(Function):C++的程序是由若干个文件组成的,每个文件又是由若干个函数组成,因此,可以认为C++的程序就是函数串,即由若干个函数组成,函数与函数之间是相对的,并且是并行的,函数之间可以调用。

(4) 语句(Statement):语句是组成程序的基本单元。每个函数都是由若干条语句组成的。 (5) 变量(Variable):变量是通过说明语句来定义的,多数程序都需要说明变量和使用变量。 (6)其他:除了以上讲述的5个部分以外,还有其他组成部分。例如,符号常量和注释信息等也是程序的一部分。C++程序中尽量把有些常量定义为符号常量,而在C++的程序中使用符号常量,该符号常量代表着某个确定的常量值。

4、 C++语言编写的程序代码有那些格式特点?

答:C++语言编写的源代码程序的格式具有以下特点:

(1) C++语言的关键字是小写字符构成的,习惯上也使用小写字母书写程序; (2) 大多数语句结尾必须用 \作为终止符, 否则C++不认为该语句的结束; (3) 每个程序必须有一个且只能有一个主函数,其名称为main()的函数;

(4) 每个函数的函数体 (包括主函数和每个子函数) 必须用一对花括号\和\括起来; (5) 一个较完整的程序文件大致含有: 包括文件程序段(一组#include<*.h>语句)、函数说明

部分、全局变量说明、主函数和若干个子函数组成。在主函数和子函数中又包括局部变量定义、库函数调用、流程控制语句、用户函数的调用语句等;

(6) 注释部分包含在\和\之间或\之后, 在编译时它将被C++编译器忽略;

(7) 像其它一些语言一样, C++的变量在使用之前必须先说明其数据类型, 未经说明的变量不能使用。说明变量类型应在可执行语句前面, 如上例main()函数中的第一条语句就是变量说明语句, 它必须放在所用的执行语句前面。

(8) 在C++语言中, 大小写字母是有区别的, 相同字母的大小写代表不同的变量;

5、 编写C++语言程序,在书写格式上应该遵从哪些基本原则? 答:

为了使程序结构更加清楚、易于阅读、维护和修改,在书写格式上应该遵从以下基本原则: (1) 一般一行只写一条语句;

(2) 一条复杂语句采用多行,如分支语句和循环语句;

(3) 遇到嵌套语句应向后缩进, 必要时对程序增加适当的注释行。

6、 什么叫关键字?什么叫标识符?

答:关键字(Keyword)也叫保留字(Reserved Word)。所谓关键字就是指已被C++语言本身使用, 不能作为其它用途使用的单词。

标识符是用户为程序中各种需要命名的\元素\所起的名称。

第二章 数据与运算

1、什么数据 ?什么叫数据类型 ?

答:数据是指能输入到计算机中,并能被计算机处理和加工的对象。 数据类型是对系统中实体的一种抽象,它描述了某种实体的基本特性,不同类型数据的表示、所占存储空间的大小以及定义在其上的操作是不同的。

2、 C++语言有哪些基本数据类型?其值域是什么? 类型名称 char signed char unsigned char bool short(signed short) unsigned short int( signed int) unisnged int long(signed long) 长度(字节) 1 1 1 1 2 2 4 4 4 值 域 -128~127或0~255(使用/J编译选项) -128~127 0~255 非零(true), 零(false) -32768~32767 0-65535 -2147483648~2147483647 0~4294967295 -2147483648~2147483647 unisnged long float double 4 4 8 0~4294967295 1.175494351e-38~3.402823466e+38(正数) 2.2250738585072014e-3081.7976931348623158e+308(正数) ~

3、 C++语言有哪些常量?请给出实例。 答:C++语言共有六种常量,分别如下: (1)整型常量

整型常量通常简称为整数。C++语言的整数可以是十进制数、八进制数和十六进制数。 例如,十进制的数值3356可以有下列三种不同的表示形式: 十进制数 3356;八进制数 06434 ;十六进制数 0xd1c (2)浮点常量

浮点常量又称为实数,一般含有小数部分。

例如,

-0.6523, .08765, 1234.0, 9.9999, 98., 5.544, 2355.876554都是一般形式的实数。 (3)字符常量

所谓字符常量是指一个单一字符, 其表示形式是由两个单引号包括的一个字符。 例如, 'A', 'a', 'Q', '0', '9', '+', ':', '?', '$' 都是字符常量。 (4)字符串常量

所谓字符串常量是指用双引号括起来的一串字符来表示的数据

下面给出几个字符串常量的例子:

\ \ \ \ \李四\\北京海淀学院路29号\, \姓名:\, \ \(5)标识常量

所谓标识常量是指用标识符代替常量使用的一种常量, 其名称通常是一个标识符。

标识常量的一般说明形式为:

#define <标识常量名称> <常量> 例如,

#define MAX 50 #define PI 3.1415926 #define ERROR -1

其中,MAX、PI以及ERROR都是标识常量, 它们代替的常量分别是50、3.1415926、和-1 。

(6)换码序列

所谓换码序列是用反斜线\\后面跟有一个字符或者一个或不超过3个的数字来表示的

控制代码的换码序列如下表所示, 它们的表示形式是在反斜线\\后面跟有一个小写英文字母。例如,'\\a','\\\\', '\\'', '\\056', '\\x05a'

4、 什么叫说明语句?怎样说明的变量为局部变量?怎样说明的变量为全局变量?

答:一般来说,变量在使用以前,必须说明才能使用。用来说明已有类型的变量的语句称为变量说明语句。变量说明的一般形式是: <存储类型> <数据类型 > <变量名> ; 在上面变量说明的式子里,<变量名>之后有一个分号“;”意味着它是一个语句,该语句我们通常称为变量的说明语句。

在函数体或程序段内说明的变量只能在定义它的函数体内或程序段内可以访问,这种变量通常称为局部变量;在函数体外说明的变量可以在说明它的文件中所有函数里或程序段中访问,也可以通过extern被其它文件中的函数或程序段访问,这种变量通常称为全局变量。

5、 说明变量时有哪些存储类型?其含义是什么?

答:C++语言支持四种存储类型:auto, register, static和extern。

(1) auto称为自动型也称为堆栈型,用auto存储类型说明的变量都是局部于某个程序范围内的,只能在某个程序范围内使用,通常在函数体内或函数中的复合语句里。

(2) register称为寄存器型,使用register关键词说明的变量主要目的是想将所说明的变量放入CPU的寄存器存储空间中,这样可以加快程序的运行速度。

(3) static称为静态存储类型,在C++语言中,既可以在函数体内,也可在函数体外说明static 存储类型的变量。在函数体内说明的static 存储类型的变量也是一种局部变量,与auto最大不同点是:static存储类型的变量在内存中是以固定地址存放的,而不是以堆栈方式存放的;只要整个程序还在继续运行静态变量就不会随着说明它的程序段的结束而消失,它下次再调用该函数,该存储类型的变量不再重新说明,而且还保留上次调用存入的数值。 (4) extern称为外部参照引用型,使用extern说明的变量是想引用在其它文件中函数体外部说明的变量。当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可引用这个变量。这种变量的作用域是所有的函数和程序段,一般用于在函数之间传递数据。

6、 什么叫常量化变量?其作用是什么?

所谓常量化变量是指将一个变量说明为一个常量。

作用:当一个变量被说明为常量时,那么该变量在程序执行过程中其值是不能改变的。也就是说,不能再向常量化的变量再赋值。因此,常量化变量在说明时就必须赋给一个数值。常量化的变量基本上和常量一样。

7、 什么叫数组?说说short型的数组与char型的数组的异同点。 答:

所谓数组是具有一定顺序关系的若干个变量的集合,组成数组的各个变量称为数组的元素。数组中各元素的数据类型要求相同。数组可以是一维的,也可以是多维的。

char型的数组由包含ASCII字符集中的字符(英文字母、数字、标点符号以及某些特殊符号)的整数类型组成的数组。

short型的数组是由short数据类型组成的数组。类型short (或short int)是一种短整数类型,它占用字节的长度大于类型char, 小于或等于类型int。

8、 什么叫表达式?什么叫表达式语句? 答:

所谓表达式是指由运算符、运算量和标点符号组成的有效序列,其目的是用来说明一个计算过程。

表达式可以独立形成语句,该语句称为表达式语句

9、 什么叫左值?什么叫右值?

答:所谓左值是指能够出现在赋值表达式左边的表达式。

所谓右值是指只能出现在赋值表达式的右边的数值。

第四章 指针

1、什么叫内存单元的地址?什么叫指针?

答:在计算机内部的存储器(简称内存)中,每一个字节单元,都有一个编号,称为地址。内存单元的编号,称为内存单元的地址。

在C++语言中,内存单元的地址称为指针。 2、什么叫指针变量?什么叫指针的目标?

答:专门用来存放地址的变量,称为指针变量(pointer variable)。指针指向的内存区域中的数据称为指针的目标。

3、什么叫空指针?其作用是什么?

答:所谓空指针就是指针变量的内容为零的状态。 4、指针运算的实质是什么?

答:指针运算是以指针变量所存放的地址量作为运算量而进行的运算。因此,指针运算的实质就是地址的计算。

5、指针有哪些运算?请枚举这些计算。

答:指针运算的种类是有限的,它只能进行算术运算、关系运算和赋值运算。 6、什么叫数组的指针?什么叫指针数组的指针?

答:在C++语言中,数组的指针是指数组在内存中的起始地址。

指针变量数组和普通的一般变量数组一样,编译系统在处理指针数组说明时, 按照指定的存储类型为它在内存中分配一定的连续存储空间,这时指针数组名就表示该指针数组的存储首地址,即指针数组的指针。

7、什么叫二级指针变量?什么叫多级指针变量?

答:对于指向处理数据的指针变量称为一级指针变量,简称一级指针。而把指向一级指针变量的指针变量称为二级指针变量,简称二级指针。我们把一个指向指针变量的指针变量,称为多级指针变量。

8、new运算符的作用是什么?delete运算符的作用是什么?

答:运算符new主要用于分配内存,并获得分配到的内存的首地址,通常需要将其赋给相应数据类型的指针。如果程序中不再需要由new分配的内存空间时,用运算符delete释放这些空间。

9、什么叫引用?

答:所谓引用是指给一个变量或一个数组起一个别名。使用引用进行运算的实质是操作原来的变量或数组本身的另一个使用名称。

10、const型指针有几种形式?其作用是什么? 答:const型指针主要有下面三种形式:

( a ) 常量化指针目标表达式 :常量化指针目标是限制通过指针改变其目标的数值。 ( b ) 常量化指针变量 :常量化指针变量,使得<指针变量>的地址值不能修改。但可以通过*<指针变量名称>可以修改指针所指向变量的数值。

( c ) 常量化指针变量及其目标表达式:常量化指针变量及其目标表达式,使得既不可以修改<指针变量>的地址,也不可以通过*<指针变量名称>修改指针所指向变量的值。

11、什么叫void型指针?其作用是什么?

void型的指针变量是一种不确定数据类型的指针变量,它可以通过强制类型转换让该变量指向任何数据类型的变量或数组。

第五章 函数与宏

1、 请给出函数概念的基本描述。

答:函数就是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。 2、 什么叫函数原型?

答:函数原型是指由函数定义中抽取出来的能代表函数应用特征的部分,包括函数的数据类型、函数名称、形式参数说明。 3、 什么叫函数的实参?什么叫函数的形参?

答:实参是在调用函数过程中传递给被调用函数的参数;形参是被调用函数接受调用函数传递过来的数据的参数。

4、 请说出函数参数为一般变量的复制传递方式、地址传递方式和引用方式的异同点。

答:复制传递方式是实参的数据拷贝给了形参变量,实参和形参是具有相同数据类型但存储空间是不同的两组空间。在复制传递方式下,被调用函数里对形参的操作不能改变实参的内容。

地址传递方式和复制传递方式正好相反,用函数的参数本身传给被调用函数。被调用函数中对形参的操作将直接改变实参的值。调用函数将实参的地址传送给被调用函数,被调用函数对该地址的目标操作即对实参本身的操作。按地址传递,实参为变量的地址,而形参为同类型的指针。

引用方式和地址传递方式的效果一样,但引用更直接、更方便。按引用传递,实参为变量,形参为同类型的引用。采用引用方式实参和形参使用的是相同的内存空间,只是名称不同而已。

5、 数组在函数间传递形式有哪些?并给以比较和解释。

答:数组在函数间的传递形式有复制传递方式、地址传递方式、引用方式和全局数组传递方式。

函数与函数之间数组的复制传递方式是调用函数将实参数组传递给被调用函数形参,形参接收是实参的地址。

函数与函数之间数组的地址传递方式是将调用函数中的实参数组的起始地址传递给被调用函数的指针变量形参。被调用函数中对形参地址的目标操作,相当于对实参本身的操作,将直接改变实参数组的值。地址传递方式,实参应该为数组的指针,而形参

应为同类型的指针变量。另外,数组的地址传递方式不仅要把实参数组的指针作为参数传递给函数,同时还需要传递数组的长度。与引用方式不同的是被调用函数的形参应声明为数组同类型的指针变量。

函数与函数之间数组的引用传递方式需将被调用函数的形参说明为数组的引用形式。在被调用函数中,对形参进行操作就是对实参数组的直接操作。数组的引用方式和地址传递方式的作用效果基本一样,但引用更直接、更方便。按引用方式传递数组,形参为实参同类型的数组引用。但引用数组名不是指针变量,不能作为左值。 6、 什么叫函数指针?什么叫指针函数?

答:函数指针是一个函数执行代码的起始地址。指针函数是指一个函数的返回值为地址量的函数。 7、 什么叫内联函数?

答:内联函数是类声明体里定义的函数或在类的实现部分定义的、其前用inline修饰的函数;它将简单的函数(其内不能有循环语句和开关语句)\内嵌\到调用他的程序代码中,这样做的目的是为了节省了调用函数的开销。 8、 什么叫函数重载?

答:函数重载是指使用一个函数名称定义了多个完成不同功能的函数,这些函数的输入参数类型或个数不一样,相应的函数类型也有可能改变。 9、 什么叫预编译语句?

在C++程序的源代码中可以包括各种编译用的命令语句,这些语句都称为预编译语句。 10、 什么叫宏?谈谈带参数宏与内联函数之间的异同点.

答:宏是指定义一个标识符来代替一个字符序列。内联函数和宏都是在程序出现的地方展开,是在调用该函数的程序处或应用宏处将它展开。但内联函数可以多行的程序段,而宏通常是单行代码段。

11、 什么叫递归函数?简述其执行过程。

答:递归函数是指一个函数的函数体中直接调用或间接调用了该函数自身的函数。 递归函数调用的执行过程分为两个阶段:

(1)递推阶段:从原问题出发,按递归公式递推,从未知到已知,最终达到递归终止条件。

(2)回归阶段:按递归终止条件求出结果,逆向逐步代入递归公式,回归到原问题求解。

第六章 自定义数据类型

1、 什么叫结构体数据类型?

答:结构体数据类型是由若干个数据成员组成的构造类型,每个成员可以是一个基本的数据类型,也可以是一个已经定义的构造数据类型,各个成员占据不同的存储空间。 2、 什么叫联合体数据类型?

答:联合体数据类型是一种混合数据使用的数据类型,它的各个成员虽然是存储不同数据类型的数据,但使用时改变其一个数据成员的数值将会影响其它数据成员的数值,各个成员共享其占用空间最多的成员所分配的存储空间。 3、 在C++语言中,请说明结构体和联合体的异同点。

答:结构体数据类型的变量可以同时存储int、long、char和double型等已有数据类型的数据,这些数据使用不同的存储空间,而联合体虽然表面上可以存储int、long、char或double等已有数据类型的数据,但它们共享其占用空间最多的成员所分配的存储空间,对某个成员赋值将影响其它成员的数值。

4、 结构体数据作为参数在函数间传递有哪几种方式?请指出它们的异同点。 答:结构体作为参数在函数之间进行传递主要有下列三种方式:

复制传递方式:把调用函数中结构体实参的值复制给被调用函数的形参构体

地址传递方式:将调用函数中实参结构体的地址传递给被调用函数形参的结构体指针。 引用方式:被调用函数的形参应该说明为引用结构体变量形式。实际上,它是为实参结构化起一个别名。

另外,还可以通过全局变量的方式在函数间进行数据传递,但这种方式不好,增加函数之间的耦合性。

地址传递方式要比复制方式效率高。结构体复制传递方式需要对实参做一个备份,它把一个结构体变量作为参数传递,但要将结构体全部成员值一个一个传递,费时间又费空间,开销大。如果结构体的成员较多,则程序运行效率会大大降低,而采用地址传递方式将结构体变量的地址作为函数参数比较好,能提高运行效率。复制传递方式不影响调用函数实参的数值,而地址传递方式有可能影响实参的数值。

第七章 类与对象

a) 什么叫面向对象的程序设计语言?什么叫类?什么叫对象?什么叫消息? 答:在程序设计语言中,面向对象是指采用抽象、封装、继承、多态等程序设计的方法。因此,具有抽象、封装、继承、多态等特性的编程语言称为面向对象的程序设计语言。

类实际上是一种抽象的数据类型,它将完成某特定功能所用到的数据和对数据的操作(即函数)封装在一起。对象是指具有某些属性和功能的单个个体。消息是对象之间相互请求或相互协作的途径,是要求某个对象执行其中某个功能操作的规格说明。

2、结构化程序设计方法存在什么问题? 答:结构化程序设计方法主要存在以下问题:

1)软件重用性差:重用性是指同一软件不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一。

2)软件可维护性差:软件工程强调软件的可维护性,强调文档资料的重要性,规定最终的软件产品应该由完整、一致的配置成分组成。在软件开发过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要的质量指标。实践证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护困难,导致可维护性差。

3)开发出的软件不能满足用户需要:用传统的结构化方法开发大型软件系统涉及各种不同领域的知识,在开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。

3、 什么叫抽象?什么叫分类?

答:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。

分类就是把具有相同属性和服务的对象划分为一类,用类作为这些对象的抽象描述。 4、 请简述结构体、联合体和类三种类类型的异同点。 答:三种类类型的异同点见下列表格: 类型 关键字 访问权限缺省 成员种类 初始化方式 结构体 struct 数据或函数访问公有 数据和函数 可以直接初始化 联合体 union 数据或函数访问公有 数据和函数 可以直接初始化 类 class 数据或函数访问私有 数据和函数 只能间接初始化

struct结构体类型和class类类型都可以封装数据和操作,具有派生性、隐藏性和多态性。而联合体不具有派生性,但具有隐藏性和多态性。

5、 什么叫根类?

答:根类是没有从其它类派生而创建的类类型。实际上,根据class类类型定义的一般形式,[:<基类型列表>]是一个可缺省的项;如缺省将定义一个根类。

6、 类定义通常分为两部分,主要指什么?

答:类的定义一般分为说明部分和实现部分,说明部分放在类定义体内,用来说明该类中的数据成员和函数成员的类型和名称,是类的外部接口;实现部分常放在类体外,用以给出说明部分中声明的成员函数的定义,是类的内部实现。

7、 在类定义中,说明成员的访问权限的public、private和protected三个关键字的

作用是什么?请分别简述之。

答:在类定义体里,使用了private、protected、public三个关键字是用来说明数据成员和函数成员的访问权限 ,private说明私有成员,该类成员只能被自己的成员函数或友元访问;protected说明保护型的成员,可以被自己的成员函数或友元访问,也可以被派生类的函数成员访问;public说明公有成员,该类成员都可以通过对象被访问的。

8、 什么叫内联函数?什么叫外联函数?

答:将说明部分和成员函数实现部分合并在类定义体内,即将该函数定义为内联函数。若该函数语句行不多且又无循环语句和开关语句也可以成为内联函数,只要在该函数的类型说明符之前使用关键字inline即可。

外联函数是指函数的说明放在类定义体内,而函数的定义是在类定义体外的类成员函数。 9、 简述构造函数和析构函数的特点。

答:构造函数是类的成员函数,函数体可写在类定义体内,也可在类定义体外定义;它是一个特殊的函数,其函数名与类名相同,该函数不指定类型说明,它有隐含的返回值,该值由系统内部使用;该函数可以没有参数,也可以有一个或多个参数,即构造函数可以重载,可以定义具有不同数据类型或不同参数个数的构造函数;另外,程序中不能直接调用构造函数,在创建对象时系统将自动调用构造函数。

析构函数也是类中的成员函数,其定义的函数体可写在类定义体内,也可在类定义体外;它也是一个特殊的函数,它的名字与类名相同,但在其前面要加上“~”字符,用来区别于构造函数;析构函数也不指定数据类型,并且也没有形式参数;但一个类中只可以定义一个析构函数;析构函数还可以被调用,也可以被系统自动调用。

10、为什么要用拷贝构造函数?它有哪些特点?

答:拷贝构造函数是一种特殊的构造函数,它的功能是用一个已有数值的对象赋值给另一个同类的一个对象。拷贝构造函数是构造函数,但它是在赋值时被调用,将一个已有数值的对象的数据成员的值拷贝给另一个同类的对象的对应数据成员。

拷贝构造函数的特点如下:

(1) 该函数名同类名,因为它也是一种构造函数,并且该函数也不被指定返回类型; (2) 该函数只有一个参数,并且是对同类的某个对象的引用; (3) 每个类都必须有一个拷贝构造函数;

(4) 在新建对象时,对对象进行初始化时调用,对象之间赋值不调用。 11、简述深拷贝和浅拷贝。

答:如果一个类的数据成员需要使用动态分配的堆资源,并且这个类的对象之间发生了数据成员拥有的堆资源复制过程的时候,这个过程就可以叫做深拷贝,反之,对象存在数据成员拥有堆资源但复制过程并未实现数据成员拥有堆资源的复制情况视为浅拷贝。

12、this指针有什么作用?

答:this是专门指向类对象自身的地址常量,是一个隐含式的指针,也就是说使用它时不需要自己去定义就可使用,而是由系统自己设定的。另外,它也隐含于每一个成员函数中,也就是说类的每一个成员函数都有一个this指针,它指向了该函数所属类的对象。this是指向对象自己的指针,* this 就是对象自己。this指针只能在某一个类的函数体内使用,其他地方无意义。该指针指向类的一个实例,实际上,该指针指向当前正在操作的应用对象自身。

13、简述类中使用常对象和常成员函数需要注意的问题。 答:使用常对象和常成员函数需要注意以下问题:

(1)常对象在说明时必须进行初始化,而且不能被更新。常对象还可以作为类的成员。 (2)const是函数类型的一个组成部分,因此在函数实现部分也要带有const关键字; (3)在常成员函数里不能更改所属类的数据成员,也不能调用该类中没有用const修饰的类的成员函数;

(4)常对象只能调用它的常成员函数,而不能调用其他的成员函数;

(5)const关键字可以用于进行函数重载的区分。其重载的原则是:常对象只能调用常成员函数,一般对象调用一般成员函数。

第八章 派生与继承

1、试比较类的三种继承方式public,protected,private之间的差别。

答:不同的继承方式,导致不同访问属性的基类成员在派生类中的访问属性也有所不同: 公有继承,使得基类public(公有)和protected(保护)成员的访问属性在派生类中不变,

而基类private(私有)成员不可访问。

私有继承,使得基类public(公有)和protected(保护)成员都以private(私有)成员身份

出现在派生类中,而基类private(私有)成员不可访问。

保护继承中,基类public(公有)和protected(保护)成员都以protected(保护)成员身份

出现在派生类中,而基类private(私有)成员不可访问。 2、简述派生类的构造函数和析构函数的执行次序。

答:在派生与继承的层次结构中,当说明一个派生类的对象时,系统先执行各个基类的构造函数,先对基类成员进行初始化,然后再执行派生类的构造函数;若某一个基类也是派生类,则这种执行基类的构造函数的过程需要递归进行下去。在继承链中,构造函数的执行原则是:先执行基类的构造函数,再执行派生类的构造函数。

当一个派生类的对象使用完毕撤消时,析构函数的执行顺序正好与构造函数的执行顺序相反。即:先执行派生类的析构函数,再执行基类的析构函数。 3、什么叫做虚基类?有何作用?

答:当某类的部分或全部直接基类是从另一个基类派生而来,这些直接基类中,从上一级基类继承来的成员就拥有相同的名称,派生类的对象的这些同名成员在内存中同时拥有多个拷贝,我们可以使用作用域分辨符来唯一标识并分别访问它们。我们也可以将直接基类的共同基类设置为虚基类,这时从不同的路径继承过来的该类成员在内存中只拥有一个拷贝,这样就解决了同名成员的唯一标识问题。

虚基类的声明是在派生类的定义过程,其语法格式为:

class 派生类名:virtual 继承方式 基类名

上述语句声明基类为派生类的虚基类,在多继承情况下,虚基类关键字的作用范围和继承方式关键字相同,只对紧跟其后的基类起作用。声明了虚基类之后,虚基类的成员在进一步派生过程中,和派生类一起维护一个内存数据拷贝。

第九章 友元与静态成员

1、 什么叫友元?友元有哪些?

答:友元指的是一种特性,通过这种特性能够利用某些特定的全局函数或类的成员函数对某类的私有成员进行存取。C++语言中的友元分为友元函数和友元类。 2、 请给出友元函数与友元类的说明方法。

答:友元函数的说明方法:friend <返回值类型> <类名>(<参数说明列表>) ;

友元类的说明方法:friend class <类名> ;

3、 简述使用友元的利弊。

答:使用友元的益处:在有些情况下,能够利用某些特定的全局函数或类的成员函数对某类的隐藏成员进行存取的这种特性是非常方便的,避免了将类中所有成员都设定为公有成员;

使用友元的弊端:虽然声明友元可以方便的对类的非公有数据进行访问,但同时破坏了类的封装与信息隐藏性,并且难以维护。

4、 试说明使用静态成员的目的?静态成员跟全局变量相比有哪些优点? 答:使用静态成员的目的:实现数据共享。

静态成员相较于全局变量的优点:

1)静态成员名称的作用域只限定于定义它的类中,因此避免了与具有相同名称的其他类的成员或者相同名称的全局变量发生命名上的冲突。.2)定义静态成员保证了类的封装性。因为静态成员可以被定义成类的私有成员而全局变量却不能。3)静态成员必然是跟程序中特定的类相关联的,这将有利于程序编写者说明定义这个成员的意图,而在外部定义的全局变量有时是晦涩难懂的。

5、 静态数据成员是否可以通过对象来对其进行访问?并简要的给出相应的说明。 答:可以。因为用对象去引用静态成员函数,只是用其类型。

6、 所有静态数据成员的初始化都不能在类的内部完成是否正确?如果不正确,请举出相应

程序的例子来说明。 答:不正确。举例见程序例9.4。

7、 如果静态成员函数访问了非静态数据成员会出现怎样的错误并说明原因。

答:将提示非法操作,静态成员函数无法访问非静态数据成员。由于静态成员函数不与任何类的对象相联系,故不能对非静态成员进行默认访问。

第十章 虚拟函数与多态性

1、在C++中运行时多态性是通过什么方式来实现的?

答:在C+ +语言中,使用重载、模板和虚函数等概念来支持多态性。 2、函数重载与虚拟函数有哪些相同点与不同点? 答:相同点:函数重载和虚函数都是用来支持多态性的。

不同点:函数重载用来实现的是编译时的多态性,虚函数用来实现的时运行时的多态性。 3、虚拟函数是如何实现面向对象编程的多态性的,它会带来什么益处?

答:虚拟函数的运用使操作不在编译时被关联到指针的原始类型的实现上,而是在运行时关联到指针真正指向的对象类型的实现上,即动态联编,从而实现了面向对象编程的多态性。 虚拟函数和多态性使得设计和实现易于扩展的系统成为可能;虚拟函数和多态性的程序设计无需使用switch逻辑,使用用虚拟函数机制自动完成等价的逻辑,避免了与swilch逻辑有关的各类错误;当通过基类指针或引用请求使用虚函数时,编译器会在与对象关联的派生类中正确的选择重定义的函数;使用虚拟函数和多态性能够使成员函数的调用根据接收到该调用的对象的类型产生不同的动作。

4、请举个例子说明什么是抽象类以及在什么时候应当引入抽象类?

答:比如说水果就是一种抽象类,因为实例化水果类的任何对象是没有什么意义的,水果类型的对象它不对应客观存在的事物。如果定义的某些类型只是为了表示抽象的概念,为了将它们作为基类被其他类所继承时就应当引入抽象类。

第十一章 重载与模板

1、 简述C++语言中有哪些实现静态绑定的机制。

答:C++语言中通过函数重载和模板实现了编译时的多态性。

2、 请尽可能多地举出C++语言中隐式运算符重载的例子,然后举出必须在C++编程中

显式重载运算符的例子。

答:C++语言中预定义类型(如int类型)的“+”、“-”、“*”、“/”、“%”、“^”、“&”、“|”、“~”、“!”、“=”、“<”、“>”、“+=”、“-=”以及“*=”等常见运算操作均属于隐式运算符重载的例子。C++语言中用户自定义类型的所有操作都需要显式重载运算符。

3、 请说出函数模板与重载有什么异同点。

答:相同点:函数模板与重载都采用静态绑定实现了编译时的多态性。

不同点:函数重载主要用于功能相同而参数不同的多个函数的定义;而函数模板主要用于对不同类型的数据完成相同操作的一种简化形式。 4、 C++语言有宏为什么还要有函数模板?

答:因为有时候使用宏可能会产生副作用,并且使编译器不能进行类型检查。而函数模板和宏一样的简洁,并且还能让编译器进行全面的类型检查。 5、 使用函数模板与类模板可能造成哪些性能问题?

答:函数模板和类模板提供了软件复用的好处。但是尽管函数模板和类模板只编写一次,但程序中仍然实例化多个副本。这些副本仍然会占用大量内存。

6、 编译器通过匹配过程确定函数调用时调用哪种类型的函数,那么什么情况下进行匹

配会造成编译错误?

答:用相同参数表生成重载函数将产生语法错误。 7、 说明怎样提供特定类型的类重定义该类型的类模板。

答:使用语句“<类模板名>〈 <类型名称1>,<类型名称2>,...<类型名称n> 〉”,编译系统会自动地根据需要生成相应的类定义。

8、 假设类模板Employee有static数据成员count,如从类模板实例化三个模板类。那

么有多少个static数据成员?各有什么限制?

答:三个。从类模板Employee实例化的三个模板类有自己的类模板static数据成员,该模板类的所有对象共享一个Static数据成员。和非模板类的static数据成员一样,模板类的static数据成员也应在文件范围内初始化。每个模板类有自己的类摸板的static数据成员副本。

3、 请说出函数模板与重载有什么异同点。

答:相同点:函数模板与重载都采用静态绑定实现了编译时的多态性。

不同点:函数重载主要用于功能相同而参数不同的多个函数的定义;而函数模板主要用于对不同类型的数据完成相同操作的一种简化形式。 4、 C++语言有宏为什么还要有函数模板?

答:因为有时候使用宏可能会产生副作用,并且使编译器不能进行类型检查。而函数模板和宏一样的简洁,并且还能让编译器进行全面的类型检查。 5、 使用函数模板与类模板可能造成哪些性能问题?

答:函数模板和类模板提供了软件复用的好处。但是尽管函数模板和类模板只编写一次,但程序中仍然实例化多个副本。这些副本仍然会占用大量内存。

6、 编译器通过匹配过程确定函数调用时调用哪种类型的函数,那么什么情况下进行匹

配会造成编译错误?

答:用相同参数表生成重载函数将产生语法错误。 7、 说明怎样提供特定类型的类重定义该类型的类模板。

答:使用语句“<类模板名>〈 <类型名称1>,<类型名称2>,...<类型名称n> 〉”,编译系统会自动地根据需要生成相应的类定义。

8、 假设类模板Employee有static数据成员count,如从类模板实例化三个模板类。那

么有多少个static数据成员?各有什么限制?

答:三个。从类模板Employee实例化的三个模板类有自己的类模板static数据成员,该模板类的所有对象共享一个Static数据成员。和非模板类的static数据成员一样,模板类的static数据成员也应在文件范围内初始化。每个模板类有自己的类摸板的static数据成员副本。

本文来源:https://www.bwwdw.com/article/0lu2.html

Top