C 试题库(精心整理)
1.在C++中,函数原型不能标识( D )
A.函数的返回类型B.函数参数的个数C.函数参数类型D.函数的功能 2.在C++程序中,对象之间的相互通信通过( B )
A.继承实现B.调用成员函数实现C.封装实现D.函数重载实现 3.对于任意一个类,析构函数的个数最多为( B ) A.0 B.1 C.2 D.3 4.友元关系不能( A )
A.继承B.是类与类的关系C.是一个类的成员函数与另一个类的关系D.提高程序的运行效率 5.语句ofstream f(″SALARY.DAT″,ios::app|ios::binary);的功能是建立流对象f,试图打开文件SALARY.DAT 并与之连接,并且( A )
A.若文件存在,将文件写指针定位于文件尾;若文件不存在,建立一个新文件 B.若文件存在,将其置为空文件;若文件不存在,打开失败
C.若文件存在,将文件写指针定位于文件首;若文件不存在,建立一个新文件 D.若文件存在,打开失败;若文件不存在,建立一个新文件 6.下面说法正确的是( B )
A.内联函数在运行时是将该函数的目标代码插入每个调用该函数的地方 B.内联函数在编译时是将该函数的目标代码插入每个调用该函数的地方 C.类的内联函数必须在类体内定义
D.类的内联函数必须在类体外通过加关键字inline 定义
7.可以用p.a 的形式访问派生类对象p 的基类成员a,其中a 是( D ) A.私有继承的公有成员 B.公有继承的私有成员 C.公有继承的保护成员 D.公有继承的公有成员
8.在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是( C ) A.派生类的对象可以赋给基类的对象 B.派生类的对象可以初始化基类的引用
C.派生类的对象可以直接访问基类中的成员 D.派生类的对象的地址可以赋给指向基类的指针 9. 派生类对象可访问基类中的什么成员( A ) A.公有继承的公有成员 B.公有继承的私有成员
C.公有继承的保护成员 D.私有继承的公有成员
10. 定义析构函数时,应该注意(C)
A.其名与类名完全相同
B.返回类型是void类型
C.无形参,也不可重载 D.函数体中必须有delete语句
11. 如果类A被说明成类B的友元,则( D )。 A.类A的成员即类B的成员 B.类B的成员即类A的成员
C.类A的成员函数不得访问类B的成员 D.类B不一定是类A的友元
12. 面向对象程序设计将数据与( A )放在一起,做为一个相互依存、不可分割的整体来处理。 A. 对数据的操作 B. 信息 C. 数据隐藏 13. 在类中声明转换函数时不能指定( A )。
A. 参数 B. 访问权限 C. 操作 D. 标识符
14. 在派生类中重新定义虚函数时必须在( A )方面与基类保持一致。 A. 参数类型 B. 参数名字 C. 操作内容 D. 赋值 15. 下面关于C++中类的继承与派生的说法错误的是( C )。 A.基类的protected成员在公有派生类的成员函数中可以直接使用 B.基类的protected成员在私有派生类的成员函数中可以直接使用 C.公有派生时,基类的所有成员访问权限在派生类中保持不变 D.基类的protected成员在保护派生类的成员函数中可以直接使用 16. 重载赋值操作符时,应声明为( C )函数。 A. 友元 B. 虚 C. 成员 D. 多态
17. 在下面选项中,对类的拷贝构造函数的声明形式是(B)
A. A::A(&) B. A::A(const A&) C. A::A(A) D. void A::A(A&a) 18. 下面关于成员函数特征的描述中,错误的是(A) A.成员函数不可以设置参数的默认值 B.成员函数可以重载 C.成员函数可以是内联函数 D.成员函数可以是静态的
19. 下面关于类模板叙述不正确的是( B ) A.可以有多个构造函数 B. 类模板是模板类的实例
C. 一个类模板可以用来实例化多个模板类 D. 类模板可以有多个参数
20. 要使一个类成为抽象类,这个类应具有的条件是(A) A.至少有一个纯虚函数 B. 至少有一个虚函数 C. 只含有一个纯虚函数 D. 只含有一个虚函数
D. 数据抽象
21. 有关运算符重载正确的描述是( D )
A. C++语言允许在重载运算符时改变运算符的操作个数 B. C++语言允许在重载运算符时改变运算符的优先级 C. C++语言允许在重载运算符时改变运算符的结合性 D. C++语言允许在重载运算符时改变运算符的原来的功能 22. 下列说法正确的是( D )。
A. 一个类的对象可以是另一个类的成员 B. 一个类可以作为另一个类的派生类 C. 一个类可以在另一个类定义体进行定义 D. 以上说法均正确
23. 下列各类函数中,(C)不是类的成员函数。
A. 构造函数 B. 析构函数 C. 友元函数 D. 拷贝构造函数 24. 派生类的对象对它的基类成员中( A )是可以访问的。 A. 公有继承的公有成员 B. 公有继承的私有成员 C. 公有继承的保护成员 D. 私有继承的公有成员
25. 下面有关构造函数和new运算符关系正确的说法是( D ) A.new运算符不调用构造函数 B. 构造函数一定调用new运算符
C.当生成新类的实例时,先调用new运算符,然后调用构造函数进行初始化 D. 当new运算符动态产生类的对象时,new运算符也自动调用构造函数 26. 下面有关类性质的说法错误的是( D )
A.一个类可以有多个构造函数,但只有一个析构函数 B.析构函数和构造函数都不能有返回类型 C.不能给析构函数指定参数 D.一个类中不可以声明具有类类型的数据成员 27. 下面关于友元函数描述正确的是(C) A.友元函数是类的成员 B.友元函数在类的外部声明 C.友元函数在类中声明 D. 友元函数能够派生
28. 下面叙述正确的是( D )
A. 派生类不可以使用私用派生 B. 保护派生时,基类的保护成员在派生类中是公有的 C. 对基类成员的访问允许二义性 D. 赋值兼容规则也适用于多重继承的组合 29. 下面描述中,表达错误的是( B )
A. 公有继承时基类中的public成员在派生类中仍是public的 B. 公有继承是基类中的private成员在派生类中仍是private的
C. 公有继承时基类中的protected成员在派生类中仍是protected的 D. 私有继承时基类中的public成员在派生类中是private的 30. 拷贝构造函数的参数是( C)
A. 某个对象名 B. 某个对象的成员名 C. 某个对象的引用名 D. 某个对象的指针名 31.下列关于构造函数的描述中,错误的是( D ) A.构造函数可以设置默认参数 B. 构造函数在定义类对象时自动执行 C.构造函数可以是内联函数 D. 构造函数不可以重载
32. 数组作为函数的形参时,把数组名作为实参,传递给函数的是( A) A.该数组的首地址 B.该数组的元素个数 C.该数组中的各元素值 D.该数组的大小
33. 通过一个析构函数调用虚函数时,C++系统对该调用采用(B)。 A. 动态联编 B. 静态联编 C. 不确定是哪种联编 D.函数重载 34. 下面有关重载函数的说法中正确的是(C) A.重载函数必须具有不同的返回值类型; B.重载函数形参个数必须;
C.重载函数必须有不同的形参列表; D.重载函数名可以不同;
35. 使用string类建立对象的不正确方式是(D)。 A. string str(“OK”); B. string str=”OK”; C. string str; D. string str=’OK’;
36. 关于C++中类的继承与派生的说法错误的是( C)
A.基类的protected成员在公有派生类的成员函数中可以直接使用 B.基类的protected成员在私有派生类的成员函数中可以直接使用 C.私有派生时,基类的所有成员访问权限在派生类中保持不变 D.继承可以分为单一继承与多重继承 37. 一个类的析构函数( A )
A.唯一的 B.允许重载 C.至多可有两个 D.只能是缺省的 38. 下面关于静态成员描述正确的是(B) A. 静态成员是对象的数据成员 B. 静态成员是对象的成员 C. 静态成员是对象的成员函数 D. 静态成员不是对象的成员
39. 下面叙述正确的是(D)
A.基类的保护成员在派生类中仍然是保护的 B.基类的公有成员在派生类中仍然是公有的 C.基类的私有成员在派生类中是私有的 D.从基类派生时,可以有3种派生方法 40.说明内联函数的关键字是( )。
A. inline
B. virtual
C. define
D. static
41.假定CAb为一个类,则执行CAb oX;语句时将自动调用该类的( )
A. 有参构造函数 C. 拷贝构造函数
A. ostream
B. 无参构造函数 D. 赋值重载函数 C. stdout
D. stdin
D. long D. 运算符
42.cin是某个类的标准对象的引用,该类是( )。
B. istream
43.下面的哪个保留字不能作为函数的返回类型?( )
A. void B. int C. new 44.不能参与重载的运算符是( )。
A. 类 B. 函数 A. 私有的 B. 公有的
C. 函数模板
45.由于数据隐藏的需要,静态数据成员通常被说明为( )。
C. 保护的 D. 不可访问的
46.编译时多态性使用什么获得?( )
A. 重载函数 B. 继承 C. 虚函数 D. B和C 47.拷贝构造函数的参数通常是( )。
50.下列对类的构造函数和析构函数描述正确的是( A )。 A)构造函数可以重载,析构函数不能重载 B)构造函数不能重载,析构函数可以重载 C)构造函数可以重载,析构函数可以重载 D)构造函数不能重载,析构函数不能重载
51.在函数定义前加上关键字“inline”,表示该函数被定义为( B )。 A)重载函数 B)内联函数 C)成员函数 D)普通函数
52.下面有关重载函数的说明中, ( C )是正确的。 A. 无特殊要求
B. 指向对象的指针 D. 对象
D. 4种
C. 自已类对象的常引用 A. 1种
B. 2种
48.C++有几种联编?( )
C. 3种
49.基类和派生类可以分别称为( )。
A. “大类”和“小类” C. “小类”和“大类”
B. “父类”和“子类” D. “子类”和“父类”
A) 重载函数必须具有不同的返回值类型 B) 重载函数形参个数必须不同 C) 重载函数必须具有不同的形参列表 D) 重载函数名可以不同
53.已知: print( )函数是一个类的常成员函数,它无返回值,下列表示中,正确的是 ( A )。
A)void print( ) const;
B) const void print( ); D) void print(const)
C) void const print( );
54.假定Myclass为一个类,那么下列的函数说明中( D )为该类的析构函数。 A) void ~Myclass( ); B) ~Myclass( int n); C) Myclass( ); D) ~Myclass( ) 55.下面类的定义中有( C ) 处错误。
class myclass{int i=0; public: void myclass( ); ~myclass(value); } A) 1 B)2 C)3 D)4
56.说明虚函数的关键字是( B )。 A. inline
B. virtual B. istream
C. define
D. static
57.cout是某个类的标准对象的引用,该类是( A )。
A. ostream
C. stdout
D. stdin
58、一个类的所有对象共享的是( D )。
A. 私有数据成员 C. 保护数据成员
B. 公有数据成员 D. 静态数据成员 C. 指针参数
D. 返回类型
59.静态成员函数没有( B )。 A. 返回值
B. this指针
60. 关于C++与C语言关系的描述中,( D)是错误的。 A.C语言是C++语言的一个子集 B.C语言与C++语言是兼容的 C.C++语言对C语言进行了一些改进 D.C++语言和C语言都是面向对象的
61.按照标识符的要求,(A )符号不能组成标识符。 A.连接符 B.下划线 C.大小写字母 D.数字字符
62. 为了避免嵌套的if-else语句的二义性,C语言规定else总是与( C)组成配对关系。 A.缩排位置相同的if B.在其之前未配对的if C.在其之前未配对的最近的if D.同一行上的if
63. 在\"int A[ ][3]={{1},{3,2},{4,5,6},{0}};\"中,A[2][2]的值是( C)。 A.1 B.0 C.6 D.2 64. 设\"Char **s;\",以下正确的表达式是(B)。
A.s=\".puter\"; B.*s=\".puter\"; C.**s=\".puter\"; D.*s='C';
65. 对于\"int *pa[5];\"的描述中,(D )是正确的。
A.pa是一个指向数组的指针,所指向的数组是5个int型元素 B.pa是一个指向某数组中第5个元素的指针,该元素是int型变量 C.pa [5]表示某个元素的第5个元素的值
D.pa是一个具有5个元素的指针数组,每个元素是一个int型指针 66. 在下列表示引用的方法中,(A)是正确的。 已知:int m=10;
A.int &x=m; B.int &y=10; C.int &z; D.floAt &t=&m; 67. 下列for循环的次数为( B)。 for(i=0, x=0; !x&&i<=5; i++) A.5 B.6 C.1 D.无限
68. 对于C/C++语言的函数,下列叙述中正确的是(A)。 A.函数的定义不能嵌套,但函数调用可以嵌套 B.函数的定义可以嵌套,但函数调用不能嵌套 C.函数的定义和调用都不能嵌套 D.函数的定义和调用都可以嵌套
69. 在一个被调用函数中,关于return语句使用的描述,( D)是错误的。 A.被调用函数中可以不用return语句 B.被调用函数中可以使用多个return语句
C.被调用函数中,如果有返回值,就一定要有return语句 D.被调用函数中,一个return语句可以返回多个值给调用函数
70. 在一个函数中,要求通过函数来实现一种不太复杂的功能,并且要求加快执行速度,选用( A )。
A.内联函数 B.重载函数 C.递归调用 D.嵌套调用 71. ( D )不是构造函数的特征 A.构造函数的函数名与类名相同 B.构造函数可以重载 C.构造函数可以设置缺省参数 D.构造函数必须指定类型说明
72. 已知:类A中一个成员函数说明如下: voiD Set(A&A);
其中,A&的含义是( C )。 A.指向类A的指针为A
B.将A的地址值赋给变量Set
C.A是类A对象的引用,用来作函数Set()的参数 D.变量A与A按位与作为函数Set( )的参数
73. 已知:print( )函数是一个类的常成员函数,它无返回值,下列表示中,( A )是正确的。 A.void print( ) const; B.const void print( ); C.void const print( ); D.void print(const); 74. 关于虚函数的描述中,( C )是正确的。 A.虚函数是一个static类型的成员函数 B.虚函数是一个非成员函数
C.基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数 D.派生类的虚函数与基类的虚函数具有不同的参数个数和类型 75. 关于new运算符的下列描述中,( D)是错的。 A.它可以用来动态创建对象和对象数组
B.使用它创建的对象和对象数组可以使用运算符Delete删除 C.使用它创建对象时要调用构造函数 D.使用它创建对象数组时必须指定初始值
76.若有定义 int a=3, *p=&a ;则 *p的值是( B ) A)常量a的地址值 B)3 C)变量p的地址值 D)无意义 77.在下列关于C++与C语言关系的各描述中,( D )是错误的。 A)C语言是C++的一个子集; B)C语言与C++是兼容的; C)C++对C语言进行了一些改进; D) C++和C语言都是面向对象的。 78.在下列关于类概念的各描述中,( A )是错误的。 A)类就是C语言中的结构体类型;
B)类是具有共同行为的若干对象的统一描述体; C)类是创建对象的样板; D)类是抽象数据类型的实现。 79.采用函数重载的目的在于( D )
A) 实现共享 B)减少空间
C) 提高速度 D)使用方便,提高可读性 80.下列的各类函数中,( C ) 不是类的成员函数。 A)构造函数 B)析构函数
C)友元函数 D)拷贝初始化构造函数 81.下列静态数据成员特性中,( D )是错误的。 A) 说明静态数据成员时前边要加修饰符static; B) 静态数据成员要在类体外进行初始化;
C) 引用静态数据成员时,要在静态数据成员名前加<类名>和作用域分辨符; D) 静态数据成员不是所有对象共有的。
82.以下各选项中,正确的函数声明是( C ) A)double func( int x , int y ) B)int func( int x ; int y ) ; C)float func( int x , int y ); D)char func( int x , y ) ;
填空题
1.定义类的动态对象数组时,系统只能够自动调用该类的(无参)构造函数对其进行初始化。 2.在C++程序设计中,建立继承关系倒挂的树应使用 (单一)继承。 3.表达式cout< 5.C++支持的两种多态性分别是编译时的(操作重载)(静态)多态性和运行时的(虚函数)(动态)多态性。 6.C++中语句const char * const p=″hello″;所定义的指针p 和它所指的内容都不能被(改变(重新赋值))。 7.假定AB 为一个类,则语句AB(AB&x);为该类(拷贝)构造函数的原型说明。 8.将关键字const 写在成员函数的(函数头)和(函数体)之间时,所修饰的是this 指针。 9.在C++中,访问一个对象的成员所用的运算符是(·),访问一个指针所指向的对象的成员所用的运算符是(->)。 10.派生类从一个或多个以前定义的该类的(基类)。 11. 运算符重载时,其函数名由 (operator运算符) 构成。成员函数重载双目运算符时,左操作数是(当前对象),右操作数是(函数形参)。 12.C++支持面向对象程序设计的四个要素是:(封装性)、(继承性)、(抽象性)和(多态性)。 。 13.模板分为(类)模板和(函数)模板。 14. 定义内联函数所用的关键字(inline),定义友元所用的关键字为(friend)。 15. 当一个派生类具有多个基类时,这种继承方式称为(多重继承)。 16. 通过一个构造函数调用虚函数时,C++系统对该调用采用(静态)联编。 17. 任何类中允许有(private)、(public)、(protected)三种访问控制类型的成员,数据成员和成员函数的默认类型为(private)。 18. 只有在(公有)继承的情况下,基类和派生类之间才有赋值兼容性规则。 19. 运算符重载使用的两种方式是(成员函数)和(友元函数)。 20.成员名限定的符号是( ::),它可以在引用成员时避免(二义性)。 21. 在用class定义一个类时,数据成员和成员函数的默认访问权限是(privated)。 22. 已知int DBL(int n){return n+n;}和long DBL(long n){return n+n;}是一个函数模板的两个实例,则该函数模板的定义是(template 23. 静态数据成员必须在(类外)进行初始化。 24. 含有纯虚函数的类称为(抽象类)。 25. 若Queue是一个类,aQueue是它的一个对象,而且该类中定义了一个静态成员函数show()则在类外对该成员的函数进行调用的方式可以为(aQueue.show())和(Queue::show())。 26. 定义内联函数所用的关键字为(inline),定义友元所用的关键字为(friend)。 27. 使用成员函数重载运算符时,若运算符是二元的,则参数表中有(1)个操作数,此时(当前 对象)作为此运算符的左操作数。 28、C++程序中,对象的初始化和清理工作,分别由两个特殊的成员函数(构造函数)和(析构函数)来完成。 29、在c++中,分别用(变量)与(函数)来表现某种事物的所具有的属性和行为,并且将它们封装在一起,形成一种抽象数据类型——(类)。 30、当用一个对象初始化另一个新的同类对象,将调用(),其特殊之处在于:形参是()。 31、模板是C++支持参数化的工具,我们通常用类模板和函数模板,这些只是面向对象的()性的一个方面。 32、如果在某个类定义中用关键字()声明了一个外部函数(也许是其他类的一个成员)后,这个外部函数就可以例外的访问该类的任何成员,这个外部函数称为类的()函数。 33、可以将类的成员声明为static,使其成为()。这样的成员在编译时被创建,其实例只有一个,为所有该类的对象()。 34、()是动态动态联编的基础。它是非静态的成员函数,经过()之后,在类族中可以实现运行过程中的多态。 35、程序中有如下语句: int a=30;int b=a++;int c=++a; 则b=( ),c=() 数组A[20][20]中,第一个元素是(),最后一个元素是() 36、声明一个int型指针,请为其动态分配含10个元素的地址空间:( )。 37.在类中必须声明成员函数的(原型),成员函数的(实现)部分可以写在类外。 38.如果需要在被调函数运行期间,改变主调函数中实参变量的值,则函数的形参应该是(引用)类型或 (指针)类型。 39.(抽象)类只能作为基类使用,而不能声明它的对象。 40.进行函数重载时,被重载的同名函数如果都没有用const修饰,则它们的形参(个数)或 (类型)必须不同。 41.通过一个(常)对象只能调用它的常成员函数,不能调用其他成员函数。 42.函数的递归调用是指函数直接或间接地调用(自身)。 43.拷贝构造函数的形参必须是(本类对象的引用)。 44.设函数max是由函数模板实现的,并且max(3.5, 5)和max(3, 5)都是正确的函数调用,则此函数模板具有( 2 )个类型参数。 45.在C++中,函数重载与虚函数帮助实现了类的(多态)性。 46.由static修饰的数据成员为该类的所有对象(共享)。 47.重载函数在参数类型或参数个数上不同,但(函数名)相同。 48.使用new建立的动态对象在不用时必须用( delete )释放所占用的空间。 49.重载运算符”-” 的函数名为( oprator- )。 50.C++中类的用途有两种, 一种是类的实例化, 即生成类的对象, 另一种是通过 ( 继承 ),派生出新的类。 51.编译时多态性可以用( 重载 )函数实现。 52.一个C++程序的执行从(main)函数开始,到 (main)函数结束 。 53.在C++ 中, 函数在定义时可以预先定义出默认的形参值。默认形参值必须按(从右到左) 的顺序定义。因为在调用时,实参初始化形参是按(从左到右)的顺序。 54.类是逻辑上相关的(函数)与(数据)的封装。特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的(继承)。 55.在C++中,函数的参数有两种传递方式,它们是值传递和(地址或指针或引用传递)。 56.当一个成员函数被调用时,该成员函数的(this指针)指向调用它的对象。 57.在基类和派生类中,派生类可以定义其基类中不具备的数据和操作。对两个有相同名字的数据成员进行访问时,如果没有(作用域分隔符限定时),对此数据成员的访问将出现歧义。 58.拷贝构造函数使用(引用)作为参数初始化创建中的对象。 59.在公有继承的情况下,基类数据成员在派生类中的访问权限(保持不变)。 60. 用new申请某一个类的动态对象数组时,在该类中必须能够匹配到(没有形参的或缺省参数)构造函数,否则应用程序会产生一个编译错误。 61.静态数据成员在类外进行初始化,且静态数据成员的一个拷贝被类的所有对象(共享)。 62.为了避免可能出现的歧义,C++对if…else语句配对规则规定为:else总是与(与最近的if)配对。 63. 面向对象的程序设计有四大特征,它们是抽象、封装、 (继承)、 (多态)。 64. 在C++中,定义重载函数时,应至少使重载函数的参数个数或参数类型(不同);在基类和派生类中,成员函数的覆盖是指(派生类成员函数与在基类被覆盖的成员函数名、参数个数、参数类型和返回值类型均相同)。 65. 构造函数与析构函数除功能不同外,在定义形式上,它们的区别还包括构造函数名与类名相同,而析构函数名是在类名前加一个~、(析构函数没有参数)、(析构函数可以定义为虚函数)。 66. 动态联编要满足两个条件,它们是(被调用的成员函数是虚函数)、(用指针或引用调用虚函数)。 67. 在C++类中,有一种不能定义对象的类,这样的类只能被继承,称之为(抽象类),定义该类至少具有一个(纯虚函数)。 68. 在C++类中,const关键字可以修饰对象和成员函数,const对象不能(被修改),const成员函数不能(修改类数据成员)。 69. C++中没有字符串类型,字符串是通过(字符数组)来表示的,每一个字符串都有一个结尾字符(\\0)。 70. C++中没有输入输出语句,输入输出是通过(输入输出库)实现的, 写出一条打印整型变量n的输出语句:(cout< 判断正误题 (判断正误,在题后的括号内,正确的划上“√”错误的划上“×”。) 1.不可以定义抽象类的对象。 2.内联函数的定义必须出现在第一次调用内联函数之前。 3.模板函数与函数模板的意义完全相同。 4.只有常成员函数才可以操作常对象。 5.引用可以不初始化。 6.构造函数可以设置默认参数 7.类的析构函数的作用是对象的初始化 8.cout的默认输出对象是键盘, cin的默认输入对象是屏幕 9.抽象类可以用来直接创建对象。 10.常对象可以调用任意成员函数。 ( √ ) ( √ ) ( × ) ( √ ) ( × ) ( √ ) ( × ) ( × ) ( × ) ( × ) 简答题 1、 虚析构函数有什么作用? 解答要点: 对象销毁时,需要调用析构函数。在多态调用时,是用基类的指针访问派生类的对象。如果析构函数是非虚函数,则基类指针只能访问基类的析构函数,而不能访问派生类的析构函数,导致派生类对象销毁时,没有调用派生类的析构函数,只是调用了基类的析构函数。如果把析构函数定义成虚函数,则可克服这个问题。 2、 拷贝构造函数在哪几种情况下调用? 解答要点: 用一个对象初始化另一个对象时 当用对象作为函数参数传递时 当函数返回对象时 3、 函数重载与函数覆盖有什么不同,它们与多态有什么关系? 解答要点: 函数重载是指函数名相同,而函数的参数个数或类型不同;覆盖是指在派生类中成员函数与基类成员函数的函数名、参数个数、类型与返回值均相同;C++中正是通过虚函数的覆盖,实现多态的功能。 4、 C++继承是如何工作的? 答:继承使得派生类能够使用基类的公有和保护成员,从而实现代码的复用,派生类可以增加成员,也可以隐藏和覆盖基类的成员。对于公有继承,基类成员的访问权限在派生类保持不变。 5、 类与对象有什么区别? 答:类是类型,是对象的抽象,对象是类的具体实例。一个类可以有多个对象,每个对象都有自己的存储单元,而类不占存储单元。 6. 若程序员没有定义拷贝构造函数,则编译器自动生成一个缺省的拷贝构造函数,它可能会产生什么问题? 解答要点:当对象含有指针数据成员,并用它初始化同类型的另一个对象时,缺省的拷贝构造函数只能将该对象的数据成员复制给另一个对象,而不能将该对象中指针所指向的内存单元也复制过去。这样,就可能出现同一内存单元释放两次,导致程序运行出错。 7. 简述成员函数、全局函数和友元函数的差别。 解答要点:以下几点必须说清楚: 成员函数是在类内部定义的,作用域在类的内部,成员函数可以访问类的数据成员(公有、保护和私有数据成员),可以调用该类的其它成员函数(公有、保护和私有成员函数),可以调用全局函数。如果友元函数是另一个类的公有成员函数,则该类的成员函数也只能通过那个类的对象调用,不能调用那个类的保护和私有成员函数。非本类成员函数(其它类成员函数或全局函数)可以通过该类的对象访问该类的公有数据成员和调用该类的的公有成员函数。 不是在类中定义的成员函数都是全局函数。 如果某一个函数(全局函数或类的成员函数)定义为另一个类的友元函数,需要在那个类中用friend关键字声明,友元函数并不是类的成员,它的定义自然是在那个类的外面。 8. 简述结构化的程序设计、面向对象的程序设计的基本思想。 解答要点: 结构化的程序设计将数据和对数据的操作分离,程序是由一个个的函数组成的,面向对象的程序设计将数据和操作封装在一起,程序是由一个个对象组成的,对象之间通过接口进行通信,它能够较好地支持程序代码的复用。 9. 结构struct和类class有什么异同? 解答要点: struct和class都可以定义类,但是缺省访问权限说明时,struct的成员是公有的,而class的成员是私有的。在C++中,struct可被class代替。 程序阅读分析题 1、分析程序,写出程序的输出结果(7分)。 #include int Hour,Minute,Second; public: }; void main() {cout<<\"time set and output: \"< void ShowTime(){cout< 输出结果: time set and output: 24:24:24 8:30:30 2、分析程序,写出程序的输出结果(7分)。 #include int x,y; public: }; point::point(point &p) {x=p.x; y=p.y; cout<<\"拷贝构造函数被调用\"< cout< 3.在括号中注释相应的语句(8分) #include int stacksize; long *buffer; long *sp; public: stack(int size)//( 1 ) {stacksize=size; sp=buffer=new long[size]; } ~stack()//( 2 ) {delete buffer;}//( 3 ) void push(long ); long pop(); }; void stack::push(long data) {if(sp>=buffer+stacksize) cout<<\"overflow!\\n\"; else{*sp=data; sp++; }} long stack::pop() {if(sp<=buffer) {cout<<\"stack is empty!\\n\";return 0;} else return(*--sp); } void main() {stack *pa=new stack(10);//( 4 ) pa->push(351);// ( 5 ) pa->push(7075461); cout< 4.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均值为本小题得分。 (1)程序: #include int n; public: }; class Derived1:public Base { private: int n; Base(char s[],int m=0):n(m) { strcpy(msg,s); } void output(void) { cout< class Derived2:public Derived1 { private: int n; Derived1(int m=1): Base(\"Base\",m-1) { n=m; } void output(void) { cout< Derived2(int m=2): Derived1(m-1) { n=m; } void output(void) }; { cout< Base B(\"Base Class\",1); Derived2 D; B.output(); D.output(); 运行结果: 1 Base Class 2 1 0 Base (2)程序: #include void Setij(int a,int b){i=a,j=b;} ~Samp() { } int GetMuti(){return i*j;} protected: }; int main() { Samp *p; int i; int j; cout<<\"Destroying..\"<} p=new Samp[5]; if(!p) { cout<<\"Allocation error\\n\"; return 1; } for(int j=0;j<5;j++) p[j].Setij(j,j); for(int k=0;k<5;k++) cout<<\"Muti[\"< 运行结果: Muti[0] is:0 Muti[1] is:1 Muti[2] is:4 Muti[3] is:9 Muti[4] is:16 Destroying..4 Destroying..3 Destroying..2 Destroying..1 Destroying..0 5.请在以下两题中任选一题,该题得分即为本小题得分。如两题都答,则取两题得分之平均值为本小题得分。 (1)程序: #include Vector(int s=100); int& Elem(int ndx); void Display(void); void Set(void); ~Vector(void); protected: }; int size; int *buffer; Vector::Vector(int s) { } int& Vector::Elem(int ndx) { } void Vector::Display(void) { } void Vector::Set(void) { } Vector::~Vector(void) { } int main() { Vector a(10); Vector b(a); a.Set(); b.Display(); delete[] buffer; for(int j=0; j for(int j=0; j return buffer[ndx]; cout<<\"error in index\"< } 运行结果: 1 2 3 4 5 6 7 8 9 10 最后出现错误信息,原因是:声明对象b是进行的是浅拷贝,b与a共用同一个buffer,程序结束前调用析构函数时对同一内存区进行了两次释放。 6.阅读下面程序,写出输出结果。 #include class CPosition { public: void SetPositionY(int iPositionY) { m_iPositionY = iPositionY; void SetPositionX(int iPositionX) { } m_iPositionX = iPositionX; int GetPositionY() const { } return m_iPositionY; int GetPositionX() const { } return m_iPositionX; CPosition(int iPositionX = 0, int iPositionY = 0):m_iPositionX(iPositionX) { } m_iPositionY = iPositionY; } private: }; int main(void) { return 0; }输出结果为: cout << oPostion2.GetPositionX() << endl; cout << oPostion2.GetPositionY() << endl; cout << oPostion1.GetPositionX() << endl; oPostion1.SetPositionX(16); cout << oPostion1.GetPositionX() << endl; oPostion1.SetPositionY(18); cout << oPostion1.GetPositionY() << endl; CPosition oPostion1; const CPosition oPostion2(6, 8); int m_iPositionX; int m_iPositionY; // X坐标 // X坐标 0 16 18 6 8 7.阅读下面程序,写出输出结果。 #include CTest(Type m_tArray[], int iSize):m_pArray(m_tArray) { } void Print() const { for (int i = 0; i < m_iSize; i++) m_iSize = iSize; } { } cout << m_pArray[i] << \" \"; private: }; int main(void) { } int a[] = {1, 0, 8}; double b[] = {1.6, 1.8}; CTest CTest 上面程序的输出结果为: 1 0 8 1.6 1.8 8.阅读下面程序,写出输出结果。 #include CGoods(int iWeight) { } CGoods(const CGoods &oGood) { } ~CGoods() { } void Print() const; static int GetTotalWeight() m_iTotalWeight = m_iTotalWeight - m_iWeight; m_iWeight = oGood.m_iWeight; m_iTotalWeight = m_iTotalWeight + m_iWeight; m_iWeight = iWeight; m_iTotalWeight = m_iTotalWeight + iWeight; }; { } int m_iWeight; static int m_iTotalWeight; return m_iTotalWeight; private: int CGoods::m_iTotalWeight = 8; // 初始化静态数据成员 void CGoods::Print() const { cout << this->m_iWeight << \" \" << this->m_iTotalWeight << \" \"} int main(void) { CGoods oGood1(6); oGood1.Print(); CGoods oGood2(oGood1); oGood2.Print(); cout << CGoods::GetTotalWeight(); cout << endl; return 0; } 上面程序的输出结果为: 6 14 6 20 20 9.阅读下面程序,写出输出结果。 #include } void Print() { cout << m_tA << endl; cout << m_tB << endl; } void Print() const { cout << m_tC << endl; ; }; } Type m_tA, m_tB; const Type m_tC; private: int main(void) { } CTest CTest const CTest 上面程序的输出结果为: 0 0 1 9 1.8 10.程序分析题(本大题共5小题,每小题4分,共20分)给出下面各程序的输出结果。 1.若有以下程序: #include class B: public A { public: }; B(int aa = 0, int bb = 0): A(aa) { b = bb; } ~B() { cout << \"Destructor B! \" << b << endl; } int b; A(int aa = 0 ){ a = aa; } ~A( ) {cout << \"Destructor A! \" << a << endl; } int a; int main() { B x(5), y(6,7); return 0; } 上面程序的输出结果为: Destructor B! 7 Destructor A! 6 Destructor B! 0 Destructor A! 5 2.若有以下程序: #include class Point { }; int main() { } Point *p = new Point; p->SetPoint(5, 12); p->DisPoint(); delete p; return 0; int x, y; Point() { x = 0; y = 0; } void SetPoint(int x1, int y1) { x = x1; y = y1; } void DisPoint() { cout << \"x=\" << x <<\ << \"y=\" << y << endl; } public: 上面程序的输出结果为: x=5,y=12 3.若有以下程序: #include class Derived:public Base void Fun() { cout << \"1\" << endl;} { public: }; int main() { } Derived a; Base *p; p=&a; p->Fun(); a.Fun(); return 0; void Fun() { cout << \"2\" << endl; } 上面程序的输出结果为: 1 2 4.阅读下面程序,写出输出结果。 #include class Point { public: private: }; int main(void) { Point oPoint1; const Point oPoint2(3, 4); cout << oPoint1.GetX() << endl; oPoint1.SetX(1); cout << oPoint1.GetX() << endl; oPoint1.SetY(2); cout << oPoint1.GetY() << endl; int m_x; int m_y; // X坐标 // X坐标 Point (int x = 0, int y = 0): m_x(x), m_y(y){ } int GetX() const { return m_x; } int GetY() const { return m_y; } void SetX(int x) { m_x = x; } void SetY(int y) { m_y = y; } cout << oPoint2.GetX() << endl; cout << oPoint2.GetY() << endl; return 0; } 上面程序的输出结果为: 0 1 2 3 4 5.阅读下面程序,写出输出结果。#include public: A() { a = b = 0; } A(int aa, int bb) { a = aa; b = bb; cout << a << ' ' << b << endl; } }; int main() { A x, y(2,3); return 0; } 上面程序的输出结果为: 2 3 11.阅读下面程序,写出输出结果。 #include Class ( int n = 6 , int m = 7 ) ; ~Class ( ) ; void Set ( int n , int m ) { x = n ; private : int x, y ; } ; Class :: Class( int n, int m) y = m ; } { } Class :: ~Class( ) { } void main( ) { } Class a ( 5 ) ; Class b ( 1 , 3 ) ; cout <<\"exiting…\"< cout <<\"Construct : x= \"<< x <<\<< y << endl ; 输出结果: Construct : x= 5, y= 7 Construct : x= 1, y= 3 exiting… Destruct : x=1, y= 3 Destruct : x=5, y= 7 12. 写出下面程序的运行结果。 #include int getint( ){return num;} float getfloat( ){return fl;} }; Test::Test( ) { cout << \"Initalizing default\" << endl; num=0;fl=0.0; } Test::~Test( ) { cout << \"Desdtructor is active\" << endl; } ~Test( ); void main( ) { } Test array[2]; cout << array[1].getint( )<< \" \" << array[1].getfloat( ) < Initalizing default Initalizing default 0 0 Desdtructor is active Desdtructor is active 程序填空题 1.本程序用递归的方法计算Fibonacci数列的前20项。Fibonacci数列的规律是:数列前 两项均为1,从第三项开始,每一项都是其前两项的和。请补全fac函数。int fac( int n ) { } 2.本程序的功能是输出三角形式的九九乘法表。请在横线上填空。 3.在下面程序的横线处填上正确的语句, 以实现动态多态。 程序改错题 1. class Base { int a; public: int b; int f(int i,int j); }; class Derived:Base{ int c; public: int Base::b; Base::f(int i,int j); }; [1] int base::b; 更改为 base::b; (或访问声明仅仅调整名字 的访问,不可为它说明任何类型) [2] base::f(int i,int j); 更改为 base::f; (或访问声明不应说明函数参数) 2. #include A a(5); a.m+=10; a.show(); void A(int i=0){m=i;} void show(){cout< [3] void A(int i=0){m=i;} 更改为 构造函数去掉void(或构造函数不能指定返回值类型) [4] void ~A(){} 更改为析构函数去掉void(或析构函数不能指定返回值类型) [5] a.m+=10; 更改为对象不能访问私有成员 3. #include base(int m,int n):a(m),b(n){} static int geta(){return a;} static int getb(){return b;} void show(){cout< [6] base(int m,int n):a(m),b(n){} 更改为不能通过构造函数初始化静态数据成员(只要把b(n)去掉即可) [7] static int geta(){return a;} 更改为静态成员函数中不能引用非静态成员数据成员(或去掉static) [8] base::int b=45; 更改为int base::b = 45; 4. Template [1] Template 3. #include void setA(int); void showA(); private: int a; }; class B { public: void setB(int); void showB(); private: int b; }; class C : public A, private B { public: void setC(int, int, int); void showC(); private: int c; }; void A::setA(int x) { a=x; } void B::setB(int x) { b=x; } void C::setC(int x, int y, int z) { a=x; b=y; setA(x); setB(y); c=z; } [4] a=x; (派生类不能访问基类A类的私有成员) [5] b=y; (派生类不能访问基类B类的私有成员) [6] obj.setB(6); (不能访问B类的公有成员setB) [7] obj.showB(); (不能访问B类的公有成员showB) [8] return 0; (去掉此语句,或主函数的返回值void去掉或改为int) 程序设计题 1.编写一个函数模板,用于求数组中各元素之和,并编写测试程序进行测试。(10分) 函数模板声明如下: template Type Sum(Type tArray[], int iSize) #include template Type Sum(Type tArray[], int iSize) { Type tSum = 0; for (int i = 0; i < iSize; i++) { tSum = tSum + tArray[i]; } return tSum; } int main(void) { int a[] = {1, 2, 3}; double b[] = {1.5, 2.8, 8.9, 8}; cout << Sum(a, 3) << endl; cout << Sum(b, 4) << endl; return 0; } 2.定义一个复数类.plex, 二个数据成员为double型r, i 为private属性。定义代二个参数的构造函数和一个Show( ) 函数用以输出r, i的值, 另外作为成员函数重载的运算苻”+”的功能是将此类二个对象的数据成员r和i对应相加。这些成员函数的属性均为public. 请用C++编写此程序, 并编写测试程序进行测试。(10分) #include class .plex { private: double r, i; public: .plex(double a, double b): r(a), i(b) {} void Show() { cout << r << \" \" << i << endl; } .plex operator +(.plex obj) { return .plex(r + obj.r, i + obj.i); } }; int main() { .plex c1(3.5, 4.5), c2(2.5, 5.5), c3(0.0, 0.0); c3 = c1 + c2; c3.Show(); return 0; } 3.设计一个类DateInfo,要求其满足下述要求: (10分) (1)要求有一个无参的构造函数,其初始的年、月、日分别为:2010,6,8。 (2)要求有一个带参数的构造函数,其参数分别对应年、月、日。 (3)要求用一个成员函数实现日期的设置。 (4)要求用一个成员函数实现日期的获取。 (5)要求用一个成员函数实现输出日期。 #include class DateInfo { private: public: }; int main() { DateInfo d1, d2(1988, 8, 18); d1.Show(); d2.Show(); d2.Set(1999, 9, 19); d2.Show(); return 0; DateInfo(): year(2010), month(6), day(8){ } DateInfo(int y, int m, int d): year(y), month(m), day(d){ } void Set(int y, int m, int d) { } void Show() { cout << year << \"年\" << month << \"月\" << day << \"日\" << endl; } year = y; month = m; day = d; int year, month, day; } 4. 定义一个抽象类CShape,它有一个纯虚函数GetLength();派生出四边型类CSquare和圆类CCircle,在派生类中重载函数GetLength(),用于求图形的周长,编写测试程序进行测试。(10分) #include class CShape { public: }; class CSquare:public CShape { public: private: }; class CCircle:public CShape { public: double GetLength() const { } return 3.1415926 * m_dRadius * m_dRadius; CCircle(double dRadius) { } m_dRadius = dRadius; double m_dWidth, m_dHeight; double GetLength() const { } return 2 * (m_dWidth + m_dHeight); CSquare(double dWidth, double dHeight) { } m_dWidth = dWidth; m_dHeight = dHeight; virtual double GetLength() const = 0; private: }; int main(void) { } CCircle oCircle(10); return 0; cout << oCircle.GetLength() << endl; CSquare oSquare(2, 3); cout << oSquare.GetLength() << endl; double m_dRadius; 5.(8分)下列shape类是一个表示形状的抽象类,area( )为求图形面积的函数,total( )则是一个通用的用以求不同形状的图形面积总和的函数。请从shape类派生三角形类(triangle)、矩形类(rectangle),并给出具体的求面积函数。 class shape{ public: virtual float area( )=0; }; float total(shape *s[ ],int n) { float sum=0.0; for(int i=0;i class Triangle:public Shape { public: Triangle(double h,double w){H=h;W=w;} double Area() const{return H*W*0.5;} private: double H,W; }; class Rectangle:public Shape { public: Rectangle(double h,double w){H=h;W=w;} double Area()const{return H*W;} private: double H,W; }; 8.(10分)完成下面的函数,对有n个元素的数组a,使数组元素按逆序排列。 void inverse(int *a, int n) { int i,*p; p=new int[n]; for(i=0;i<=n-1;i++) p[i]=a[i]; for(i=0;i<=n-1;i++) a[i]=p[n-i-1]; delete []p; } 9.(12分)下面的函数统计子字符串substr在字符串str中出现的次数,如果substr在str中不出现,则返回值0。请完成该函数。 int str_count(char *substr, char *str) { int count=0; char *pChar; if(substr==NULL||str==NULL) return count; while(*str!='\\0'){ pChar=substr; while(*pChar==*str){ pChar++; if(*pChar=='\\0'){ count++;break; } else str++; }//Match while(*pCh...) statement str++; }//Match while(*str...) statement return count; } 因篇幅问题不能全部显示,请点此查看更多更全内容