C++重点知识点总结及习题(new) 下载本文

第2章 基本数据类型、运算符与表达式

【习题】 一、

选择题

1. 下列数据类型不是C++语言基本数据类型的是( )。

(a)字符型 (b)整型 (c)浮点型 (d)数组

一、 下列字符列中,可作为C++语言程序自定义标识符是( )。选择题

2.

(a)x (b)-var (c)new (d)3i 3. 下列数中哪一个是8进制数( )。

(a)0x1g (b)010 (c)080 (d)01b 4. 已知a=1,b=2,c=3,则表达是++a||-b&&++c的值为( )。

(a)0 (b)1 (c)2 (d)3 5. 下列表达式选项中,( )是正确的。

(a)++(a++) (b)a++b (c)a+++b (d)a++++b 6. 已知枚举类型定义语句为:( )。

enum color{RED,BLUE,PINK=6,YELLOW,GREEN,PURPLE=15}; 则下列叙述中错误的是( )。

(a)枚举常量RED的值为1 (b)枚举常量BLUE的值为1 (c)枚举常量YELLOW的值为7 (d)枚举常量PURPLE的值为15

二、

填空题

1. c++语言标示符是以字母或____下划线______开头的,由字母、数字、下划线组成。 2. 在C++语言中,char型数据在内存中的存储形式是____ ASCII______。

3. 在内存中,存储字符‘x’占用1个字节,存储字符串“x”要占用____2____个字

节。

4. 符号常量可以用宏定义define和_____ const_____表示。 5. 转义字符序列中的首字符是__\\_______。 6. 空字符串的长度是____0______。

7. 表达式cout<<’\\n’;还可以表示为cout<

三、

编程题

1. 编写一个程序,输入一个三位数,分别输出该数的百位、十位和个位。

【参考答案】

一、 选择题

1. d 2. a 3. b 4. b 5. c 6. a 7. c 二、 填空题

1. 下划线 2. ASCII 3. 2 4. const 5. \\ 6. 0

7. cout<

8. a+b a-b a-b 9. iomanip.h iostream.h 三、 编程题 1.

#include void main() {

int num,var1,var2,var3;

cout<<\请输入一个三位数:\ cin>>num;

if(num>999||num<100) //用于检查输入数据的合法性 else {

var1=num/100;

var2=(num-var1*100)/10; var3=num;

cout<<\百位数为:\

<<\十位数为:\<<\个位数为:\cout<<\您的输入有误!\

} }

第3章 C++程序的流程控制

【习题】 一、 选择题

1. 在循环语句中使用break语句的作用是( )。

(a)结束本次循环 (b)结束该层循环 (c)结束所有循环 (d)结束程序执行

2. 对if后的括号中的表达式,要求i不为0的时候表达式为真,该表达式表示正确的为

( )。

(a)i (b)!i (c)i<>0 (d)i=0 3. 下列循环语句的执行次数是( )。

while(!1) cout<<”ok!”;

(a)0次 (b)1次 (c)2次 (d) 无数次 4. 运行下列程序结果为( )。

#include void main() {

int i;

for (i=0;i<=10;i++){ if (i%2) cout<

(a)246810 (b)12345 (c)678910 (d)13579

二、 填空题

1. 结构化程序设计的三种基本结构是顺序结构、选择结构(分支结构)、循环结构。 2. continue语句实现的作用是____跳出本次循环。__________________________。 3.若输入”china 2008!”,运行下列程序的输出结果为___________________________。

#include #include void main( ) {

char c;

int letters=0,digits=0,others=0;

cout<<\ while ((c=getchar( ))!='\\n') {

if (c>='a' && c<='z' || c>='A' && c<='Z' ) letters++; else

if (c>='0' && c<='9') digits++; else

others++; }

cout<<\ <<\ <<\ }

please input a line charaters letters:5 digits:4 others:2

4.本程序完成1!+2!+??+18!的计算,请将程序补充完整。 #include #include void main() {

double sum=0,fac=1; for(int i=1;i<=18;i++)

{

___________ fac*=i ____________

____________ sum+=fac ___________ }

cout<<\??+18!=\

<

三、 编程题

1. 输入某学生成绩,若成绩在90-100输出"优秀",若成绩在80-89输出"良好",若

成绩在70-79输出"中",若成绩在60-69输出”及格”,若成绩在0-59输出”不及格”。

2. 输入三人数,按从小到大的大顺序输出。

3. 在100~200中找出同时满足用3除余2,用5除余3和用7除余2的所有整数。

【参考答案】 一、选择题 1. b 2. a 3. a 4. d 二、填空题

1.顺序结构、选择结构(分支结构)、循环结构 2.跳出本次循环。 3.

please input a line charaters letters:5 digits:4 others:2

4.①fac*=i; ②sum+=fac;

三、编程题 1.

#include void main() {

double grade; char* degree;

cout<<\请输入学生成绩:\ cin>>grade;

if(grade>100||grade<0) {

cout<<\您的输入有误!\ return; } else

if(grade>=70) if(grade<80) degree=\中\ else if(grade<90) degree=\良好\ else

degree=\优秀\ else if(grade>=60) degree=\及格\ else

degree=\不及格\

cout<<\分数:\ <

#include void main() {

int num1,num2,num3,num; cout<<\请输入三个整数:\ cin>>num1>>num2>>num3; if(num1>num2) {

num=num1; num1=num2; num2=num; }

if(num1>num3) {

num=num1; num1=num3; num3=num; }

if(num2>num3) {

num=num2; num2=num3; num3=num; }

cout<<\三个数按从小到大输出为:\ <

#include void main() {

cout<<\在100~200中同时满足用3除余2,用5除余3和用7除余2的整数为:\ for(int i=100;i<=200;i++) {

if(i%3==2&&i%5==3&&i%7==2) cout<

}

第4章 数组

【习题】 一、选择题

1.在C++中对数组下标说法正确的是( )。

(a)初始化数组的值的个数可以多于定义的数组元素的个数,多出部分将被忽略。 (b)初始化数组的值的个数可以少于定义的数组元素的个数。 (c)初始化数组的值的个数必须等于定义的数组元素的个数。

(d)初始化数组的值可以通过跳过逗号的方式来省略。如int a[3]={1,,2}; 2.数组定义为:int a[2][2]={1,2,3,4};则a[1][0]%3为( )。 (a)0 (b)1 (c)2 (d)4

4.运行下列程序结果为( )。 #include void main() {

int a[4]={1,2,3,4}; for(int i=3;i>=0;i--) }

(a)1234 (b)1324 (c)4231 (d)4321 5.运行下列程序结果为( )。 #include void main() {

int i,j,t,a[2][2]={8,7,6,5}; for(i=0;i<1;i++)

for(j=i+1;j<2;j++) {

t=a[i][j];

cout<

}

}

a[i][j]=a[j][i]; a[j][i]=t;

for(i=0;i<2;i++) { }

for(j=0;j<2;j++)

cout<

cout<

(a)87 (b)78 (c)86 (d)68 65 65 75 57 二、填空题

1. m?n数组包含____M______行、___N______列和______M*N____个元素。

2. 定义数组int a[10];,若要给该数组的第三个元素赋值100,其语句为___

a[2]=100_______。

3. 已知数组a中的元素个数为4,下列语句的作用是将下标为i的元素移动到下标为i-1

的单元,其中1≤i<4。a中原有数据为1,2,3,4,移动后a中元素结果为2,3,4,4。请将下列程序补充完整。 #include void main() {

int a[4]={1,2,3,4};

for(int i=0;______①i<3______;i++) } 4. 程序填空

运行下列程序后当str是对称的时,输出“是回文”,否则输出“不是回文”,请将程序补充完整。

#include void main() {

char str[20];

cin.get(str,20);//输入字符串

a[i]=______②__ a[i+1]____;

int i=0, j=0;

while (str[j])_______①___ j++________; for(j--; i

cout<<\不是回文\}

5. 运行下列程序的结果为___________________。

#include #include void main() {

int array1[3][3]={1,2,3,4,5,6,7,8,9},array2[3][3],i,j; for(i=0;i<3;i++)

for(j=0;j<3;j++)

array2[j][i]=array1[i][j];

for(i=0;i<3;i++) { } } 1 4 7 2 5 8 3 6 9

6. 运行下列程序的结果为____________________。

#include void main() {

for(j=0;j<3;j++)

cout<

cout<

int num[6],i,j;

cout<<\请输入1到50的六个正整数:\for(i=0;i<6;i++)

cin>>num[i];

for(i=0;i<6;i++) { } }

输入为:2 4 1 6 3 1 ** **** * ****** *** *

三、编程题

1设学生人数N=8,提示用户输入N个人的考试成绩,然后计算出平均成绩,显示出来。

2. 将一个二维数组行和列互换,然后存放到另一个二维数组中;

【参考答案】 一、 选择题 1.b 2.a

for(j=1;j<=num[i];j++)

cout<<\

cout<

4.d 5.c 6.

二、填空题 1.m

n

m×n

2.a[2]=100; 3.①i<3

②a[i+1]

4.①j++ ②i==j 5. 1 4 7 2 5 8 3 6 9 6. ** **** * ****** *** *

三、编程题 解: 源程序:

#include #include #define N 8

float grades[N]; //存放成绩的数组 void main() { int i;

float total,average;

//提示输入成绩

for(i = 0; i < N; i++ ) {

cout << \cin >> grades[i]; }

total = 0;

for (i = 0; i < N; i++) total += grades[i]; average = total / N;

cout << \}

#include using namespace std; #define m 2 #define n 3 int main() {

int a[m][n],b[n][m],i,j;

cout<<\请输入一个两行三列的数\ for (i=0;i

for (j=0;j

cin>>a[i][j]; b[j][i]=a[i][j]; }

}

cout<<\转换为三行两列值为\ for (i=0;i

for(j=0;j

cout<

system(\ return 0;

} 第4章

C++函数与程序结构

【内容提要】 【习题】 一、选择题

1.下列函数定义语句正确的是((a)

void fun(int var1) { int var1=0; cout<

} (b)

void fun(int var1,var2) { cout<

。 )int fun(int var1) {

if(var1)

return 1;

else

return 0; } (d)

int fun(int var1) { }

2.下列叙述中正确的是( )

(a)C++语言程序中,main()函数必须在其它函数之前,函数内可以嵌套定义函数。 (b)C++语言程序中,main()函数的位置没有限制,函数内不可以嵌套定义函数。 (c)C++语言程序中,main()函数必须在其它函数之前,函数内不可以嵌套定义函数。 (d)C++语言程序中,main()函数必须在其它函数之后,函数内可以嵌套调用函数。

3.下列对return语句叙述错误的是( )。

(a)在函数定义中可能有return语句,也可能没有return语句。 (b)在函数定义中可以有多条return语句。 (c)在函数定义中每条return语句可能返回多个值。

(d)如果函数类型不是void型,则函数定义中必须有return语句。

4.C++语言中函数返回值的类型是由( )决定的。

(a)return语句中的表达式类型 (b)调用该函数的主调函数类型 (c)定义函数时所指定的函数类型 (d)以上说法都不正确

5.C++中,关于参数默认值的描述正确的是( )。 (a)只能在函数定义时设置参数默认值

if(var1)

return 1;

else

cout<<0<

(b)设置参数默认值时,应当从右向左设置 (c)设置参数默认值时,应当全部设置

(d)设置参数默认值后,调用函数不能再对参数赋值

6.使用重载函数编程序的目的是( )。

(a)使用相同的函数名调用功能相似但参数不同的函数 (b)共享程序代码 (c)提高程序的运行速度 (d)节省存储空间

7.系统在调用重载函数时,下列不能作为确定调用哪个重载函数的依据的选项是((a)函数名 (b)参数个数 (c)函数类型 (d)参数类型

9.数组作为函数的形参,把数组名作为函数的实参时,传递给函数的是( )。 (a)数组中各元素的值 (b)数组中元素的个数 (c)数组中第0个元素的值 (d)该数组的首地址

10.运行下列程序结果为( )。 #include int f(int[][3],int,int); void main() {

int a[][3]={0,1,2,3,4,5,6,7,8};

cout<

int f(int a[][3],int row,int col) {

int i,j,t=1;

for(i=0;i

{a[i][j]++; //每个值加1 if(i==j) t*=a[i][j];

。 ) } return t; }

(a)0 (b)48 (c)105 (d)45

相当于 下面矩阵的对角线相乘 1 2 3 4 5 6 7 8 9

11.运行下列程序的输出结果为( )。 #include int var; main() {

int var=2;

::var=0; //访问全局变量 if(var>1) {

int var=5;

cout<

} }

(a)20 (b)000 (c)520 (d)500 二、填空题

1.一个C++语言程序总是从_____ main函数_____开始执行。

3.在函数原型说明中必须包含的要素有函数类型(如果省略则默认为int型)、___函数名______、______参数表_____。

4.____ const ______限定符声明只读变量。

5.若某个函数没有返回值,则该函数的类型应定义为_____ void _____类型。 6.一个函数直接或间接地调用自身,这种现象称为函数的____递归调用______。

cout<

7.在一个函数的定义或声明前加上关键字___ inline _______则就把该函数定义为内联函数,它主要是解决____程序的运行效率______问题。

8.函数的参数传递的方式分为两类,分别是_____值传递_____方式和_____引用传递_____方式。

9.在c++中,可以有多个同名而处理不同参数类型或个数的函数,称为函数____重载______。

12.运行下列程序的结果为____ ______。 #include void swap(int &,int &); void main() {

int a=66,b=4; cout<<\“ <

cout<<\“ <

void swap(int &x,int &y) { int t=x; x=y; y=t; }

a=66,b=4 a=4,b=66

13.运行下列程序的结果为__________。 #include #include

void fun(int array[ ],int n); void main( )

{ }

void fun(int array[ ],int n) { }

? 1 1 2 3 5 8 13 21 34 55

14.运行下列程序,若输入1 2 3 4 5则输出结果为_______________________。 #include void rev(int n) { }

void main() {

rev(5); int x; cin>>x; if(n==1)

cout<

for(i=2;i

array[i]=array[i-1]+array[i-2]; int a[10]={1,1}; int i; fun(a,10); for(i=0;i<10;i++)

cout<

cout<

else { }

rev(n-1); cout<

}

用递归调用:54321

15. 运行下列程序结果为________________。 #include

void fun(char PrChar='$',int num=10); main() {

char ch; int num; ch='#'; num=20; fun(ch,num); fun(); fun('&'); return 0; }

void fun(char ch,int num) {

for(int i=0;i

cout<

#################### $$$$$$$$$$ &&&&&&&&&&

cout<<\

16.运行下列程序结果为____________________________。 #include void fun( ); void main( ) { }

void fun( ) { }

答案:01234

三、编程题

1. 编写函数将华氏温度转换为摄氏温度,公式为c?(F?32)?5?9;并在主函数中调用。 2. 编写函数利用全局变量统计数组中奇数和偶数的个数。

【参考答案】 一、选择题 1. c 2. b 3. c 4. c 5. b 6. a 7. c 8. b 9. d 10. d 11. c

static int m=0; M的值保持不变 cout<

for(i=0;i<5;i++)

fun();

二、填空题 1. main函数 2. 函数原型 3. 函数名、参数表 4. const 5. void 6. 递归调用

7. inline、程序的运行效率 8. 值传递、引用传递(或地址传递) 9. 重载

10. 函数范围、文件范围、块范围、函数原型范围 11. static 12. a=66,b=4 a=4,b=66

13. 1 1 2 3 5 8 13 21 34 55 14. 54321 15.

#################### $$$$$$$$$$ &&&&&&&&&& 16.01234 三、编程题 1.

#include double ftoc(double); void main() { }

double ftoc(double f) {

double c; c=(f-32)*5/9; return c;

cout<<\华氏温度\度为摄氏\度!\

} 2.

#include int numo=0,nume=0; void sta(int a[],int); void main() { const int N=10;

int array[N]={0,2,3,4,5,6,7,8,10,12}; sta(array,N);

cout<<\奇数有\个,\

<<\偶数有\个\

}

void sta(int a[],int n) { for(int i=0;i

else

numo++; }

第6章

指针、引用和动态空间管理

【习题】 一、选择题

1. 要使变量i成为int型变量x的别名,正确的定义语句是( )。 (a) int &i=x; (b) int i=&x; (c) int &i=&x; (d) int i=x; 2. 在下列指针表达式中,与下标访问a[i][j]不等效的是( )。 (a) *(a+i+j) (b) (*(a+i))[j] (c) *(*(a+i)+j) (d) *(a[i]+j)

3. 已定义字符串char str[5],则下列表达式中不能表示str[1]的地址的是((a) str+1 (b) str++ (c) &str[0]+1 (d)&str[1]

4. 已知:int a[]={1,2,3,4,5,6},*p=a,x;下面语句中x的值为5的是( )。。 )

(a) p+=3;x=*(p++); (b) p+=5;x=*p++ ; (c) p+=4;x=*++p; (d) p+=4; x=*p++ 5. 若有说明:int i,j=6,*p;p=&i;则与i=j等价的语句是( )。 (a) i=*p; (b) *p=*&j; (c) i=&j; (d)i=**p;

6. 设p1和p2是指向同一个int型一维数组的指针变量,k为int型变量,则不能正确执行

的语句是( )。

(a) k=*p1+*p2; (b) p2=k; (c) p1=p2; (d) k=*p1*(*p2); 7. 下面函数的功能是( )。 int fun(char *x) {

char *y=x;

while(*y++){}; //执行到结尾,即指针指到字符串的尾部 return y-x-1; }

(a) 求字符串的长度 (b) 求字符串存放位置

(c) 比较两个字符串的大小 (d) 将字符串x连接到字符串y后面 8. 执行以下程序段后,m的值为( )。

int a[2][3]={{1,2,3},{4,5,6}};

int m,*p=&a[0][0];

m=(*p)*(*(p+2))*(*(p+4)); //第1,3,5个元素的乘积

(a) 15 (b) 14 (c) 13 (d) 12 9. 设有如下定义,下面关于ptr正确叙述是( )。

int (*ptr)();

(a) ptr是指向一维数组的指针变量。 (b) ptr是指向int 型数据的指针变量。

(c) ptr是指向函数的指针,该函数返回一个int型数据。

(d) ptr是一个函数名,该函数的返回值是指向int型数据的指针。 10. 若有如下语句:

int **pp,*p,a=10,b=20; pp=&p; p=&a; p=&b;

cout<<*p<<”,”<<**pp<

二、填空题

(b) 10,10

(c) 20,10

(d) 20,20

1. 运行下列程序结果为_____10_____。 #include void main()

{ int a[3]={10,15,20};

int *p1=a,*p2=&a[1]; //*P2=15 *p1=*(p2-1)+5; //*P1=15 *(p1+1)=*p1-5; // A[1]=10 cout<

2. 运行下列程序结果为max=15,min-=-5,请将程序补充完整。 #include const int N=10;

void max_min(int arr[],int *pt1,int *pt2,int n) { }

void main() { }

三、编程题 【参考答案】

void max_min(int arr[],int *pt1,int *pt2,int n); int array[N]={1,8,10,2,-5,0,7,15,4,-5}; int *pt1,*pt2,a,b; pt1=&a; pt2=&b;

max_min(_________③___ array,pt1,pt2,N_________); cout<<\int i;

*pt1=*pt2=arr[0]; for(i=1;i

if(arr[i]>*pt1) ________①___*pt1=arr[i];_______ if(arr[i]<*pt2) ________②____*pt2=arr[i]______

一、选择题 1. a 2. a 3. b 4. d 5. b 6. b 7. a 8. a 9. c 10. d

二、填空题 1. 10

2. ①*pt1=arr[i];②*pt2=arr[i];③array,pt1,pt2,N 3. MONTH NO3 MARCH 4. 123

321 321

第8章

类和对象的创建

【习题】 一、选择题

1.下列各项中不能用于声明类的成员访问控制权限的关键字是((a)private (b)protected (c)public (d)static 2.下列关于构造函数的说法错误的是( )。

。 ) (a)构造函数的名字必须与类的名字相同。 (b)构造函数可以定义为void类型。 (c)构造函数可以重载、可以带有默认参数。

(d)构造函数可以由用户自定义也可以由系统自动生成。 3.有如下类声明: class student {

int age; char *name; };

则student类的成员age是( )。

(a)公有数据成员 (b)私有数据成员 (c)保护数据成员4.有如下类定义 #include class point { int x,y; public:

point():x(0),y(0){}

point(int x1,int y1=0):x(x1),y(y1){} };

若执行语句 point a(2),b[3],*c;

则point类的构造函数被调用的次数是( )。 (a)2次 (b)3次 (c)4次 (d)5次 5.在下列哪种情况下不会调用拷贝构造函数( )。 (a)用一个对象去初始化本类的另一个对象时。

(b)函数的形参是类的对象,在进行形参和实参的结合时。 (c)函数的返回值是类的对象,函数执行完返回时。 (d)将类的一个对象赋值给另一个本类的对象时。 6.下列关于友元的描述错误的是( )。 (a) 友元关系是单向的且不可传递

(b) 在友元函数中可以通过this指针直接引用对象的私有成员。 (c) 友元可以是一个普通函数也可以是一个类。

(d) 通过友元可以实现在类的外部对类的私有成员的访问。 7.有如下程序

(d)私有成员函数 #include using namespace std; class AA{ int n;

public:

AA(int k):n(k){ } int get( ){ return n;} int get( )const{ return n+1;} }; int main( ) { AA a(5); const AA b(6);

cout<

运行该程序结果为( )。

(a)56 (b)57 (c)67 8.有如下程序: #include class Test { public: Test( ) { n+=2; } ~Test( ) { n-=3; }

static int getNum( ) { return n; } private: static int n; };

int Test::n = 1; int main( ) {

Test* p = new Test; delete p;

cout << \return 0; }

执行后的输出结果是( )。

(a) n=0 (b)n=1 (c)n=2 (d)66 (d)n=3

9.下列程序的运行结果为( )。 #include class A { public: };

int A::num=0; void g(A& a) { }

void main() { }

(a)0 (b)1 (c)2 (d)3

10.运行下列程序结果为____________________。 #include #include using namespace std; class MyClass{ public: }; int main(){

MyClass p1,*p2; p2=new MyClass('X'); delete p2; return 0;

MyClass(){cout<<'A';} MyClass(char c){cout<

cout<

num++; return *this;

}

执行这个程序幕上将显示输出______。

(a)ABX (b)ABXB (c)AXB (d)AXBB

二、填空题

1.类的成员包括___数据_____成员和成员___函数_____。

2.释放对象所占的内存空间并完成善后处理工作的是____析构_______函数。 3.拷贝构造函数以_____本类对象的引用_________作为参数。 4.用指向对象的指针引用对象成员使用操作符___->_______。

5.当一个对象生成以后,系统就为这个对象定义了一个_____ this指针_____,它指向这个对象的地址。

6.在类中声明静态成员的关键字是___ static ________。

7.非成员函数应声明为类的____友元________函数才能访问这个类的private成员。 8.C++建立和初始化对象的过程由_____类的构造函数__________完成。

9.对于常量数据成员和引用数据成员的初始化只能通过______成员初始化列表__________来完成。

10.在类中说明的具有类类型的成员称为_____对象成员____________。 11.下列为类的定义语句,是否有错,若有错请改正。 class circle --------------------------------------------① {

double r=3;---------------------------------------②

public:----------- ---------------------------------------③

circle(double i) ----------------------------------④ { }

double area();//面积-----------------------------⑥

r=i; ------------------------------------------⑤

double prm();//周长-----------------------------⑦

void printarea(double); -------------------------⑧ void printprm(double); ------------------------- }--------------------------------------------------------⑩ //成员函数的实现

12.下列程序输出结果为0,1.请将程序补充完整。 #include

class A{

int num; A():num(0){} void set(int num)

{ ________①___ A::num=num ________}//给A的数据成员num赋值 int get()

{_________②___ return num;________}//获得数据成员num的值 }; int main() { }

13.下列程序输出:2,33.4,tom。请将程序补充完整。 #include #include class A {

int i; float j; char c[20]; public:

A(int x, float y, char ch[]):i(x),j(y) { }; void main() {

A a(2,33.4,\ }

void printA() { }

________②____ cout<

cout<

cout<

}

a.printA();

14.下列程序的输出结果为 Object id=0 Object id=1

请将程序补充完整。 #include class Point { public: };

_____ int Point::countP=0;_____________//静态数据成员的初始化 int main( ) { }

15. 插入排序算法的主要思想是:每次从未排序序列中取出一个数据,插入到已排序序列中的正确位置,InsertSort类的成员函数sort()实现了插入排序算法,请将画线处缺失的部分补充完整。

#include class InsertSort{ public:

InsertSort(int*a0,int n0):a(a0),n(n0){}//a是数组首地址,n是数组元素个数 void sort()

{//此函数假设已排序序列初始化状态只包含a[0],未排序序列初始为a[1]?a[n-1]

for (int i=1;i

Point(int xx=0, int yy=0) {X=xx; Y=yy; countP++; } Point( ) { countP--; } int GetX( ) {return X;} int GetY( ) {return Y;}

static void GetC( ) {cout<<\ int X,Y;

static int countP;

private:

};

}

{ }

int j,t;

for(_______________;j>0;--j) { } a[j]=t;

if(t>a[j-1])break; a[j]=a[j-1];

protected:

int*a,n;//指针a用于存放数组首地址,n用于存放数组元素个数

三、编程题

1. 自定义一个正方体类,它具有私有成员x,表示正方体的每个面的正方形的边长。提供构造函数以及计算正方体的体积和表面积的公有成员函数,并编制主函数,对正方体类进行使用:说明正方体类对象,输入棱长,计算其体积和表面积并显示结果。

2. 设计一个时间类Time,包括3个数据成员,时(hour)、分(minute)、秒(second),以及成员函数用于设置和读取时、分、秒,并按上午、下午各12小时或按24小时输出时间。

【参考答案】 一、选择题 1.d 2.b 3.b 4.c 5.d 6.b 7.b 8.a 9.b 10.d 二、填空题 1.数据、函数

2.析构

3.本类对象的引用 4.-> 5.this指针 6.static 7.友元 8.类的构造函数 9.成员初始化列表 10.对象成员 11.②⑩ 改正如下:

②double r; ⑩末尾加分号。

12.①A::num=num; ②return num; 13. ①strcpy(c,ch);

②cout<

三、编程题 1.参考程序如下: #include #include class cube { };

double cube::volume()

double x; cube(double xx) { }

double volume(); double sarea();

x=xx;

public:

{ }

double cube::sarea() { }

void main() { }

2.参考程序如下: #include class Time { };

int Time::sethour(int h) {

if(h>=24||h<0) else

return 0; int hour; int minute; int second; int sethour(int); int setminute(int); int setsecond(int); int gethour(); int getminute(); int getsecond(); void show12(); void show24(); double a;

cout<<\请输入棱长:\cin>>a; cube c(a);

cout<<\该正方体的体积为:\

<<\该正方体的表面积为:\return pow(x,2)*6; return pow(x,3);

public:

}

{ }

hour=h; return 1;

int Time::setminute(int m) { }

int Time::setsecond(int s) { }

int Time::gethour(){return hour;} int Time::getminute(){return minute;} int Time::getsecond(){return second;}

void Time::show12() { }

void Time::show24()

if(hour==12) else

cout<=0)?\cout<=60||s<0) else { }

second=s; return 1; return 0; if(m>=60||m<0) else { }

minute=m; return 1; return 0;

{ }

void main() { } 【习题】 一、选择题

1.在私有继承的情况下,允许派生类直接访问的基类成员包括( )。 (a)公有成员和私有成员 (b)公有成员和保护成员 (c)保护成员和私有成员 (d)公有成员、私有成员和保护成员

2.有如下类定义: class base{ public:int x; protected: int y; private: int z; };

派生类采用什么方式继承可以使x成为自己的公有成员( )。 (a)公有继承 (b)保护继承 (c)私有继承 (d)以上三个都对

3.派生类的对象对其基类成员中( )是可以访问的。 (a)公有继承中的公有成员 (b)公有继承中的保护成员 (c)私有继承中的公有成员 (d)以上三者都对

int h,m,s; cin>>h>>m>>s; Time t;

if(t.sethour(h)==0||t.setminute(m)==0||t.setsecond(s)==0) { }

t.show12(); t.show24();

cout<<\输入时间错误!\return;

cout<

4.下列虚基类的声明正确的是( )。 (a)class derived:virtual public base (b)virtual class derived:public base (c)class virtual derived:base (d)class derived: base1 virtual

5.有如下类声明: class base{ };

class derived: protected base{ protected: };

则类derived中保护的数据成员和成员函数的个数是( )。 (a)1 (b)2 (c)3 (d)4

二、填空题

1. 1.在继承中,缺省的继承方式是____私有继承_______。

2. 2.派生类中的成员函数不能直接访问基类中的____私有________成员。 3. 3.保护派生时,基类中的所有非私有成员在派生类中是__保护________成员。 4.当创建一个派生类对象时,先调用_____基类_____的构造函数,然后调用_对象成员所在类______的构造函数,最后调用______派生类______的构造函数。

4. 5.对于基类数据成员的初始化必须在派生类构造函数中的_____成员初始化列表______处执行。

5. 6.为了解决在多重继承中因公共基类带来的__二义性___________问题,C++语言提供了虚基类机制。

7.将下列的类定义补充完整。 class base

int j;

void set(int m, int n){ base::set(m); j=n;} int get( )const{ return base::get( )+j; } public:

int i;

void set(int n){ i=n;} int get( )const{ return i; } public:

{ public: };

class derived:public base { };

void derived::g() { f();

//被调用的函数是derived:: f()

//调用基类的成员函数f

int f(); int g(); int f();

__________________ }

8.有如下程序: #include class base{ public: };

class derived: public base{ public: }; int main() { }

derived x; return 1;

base(){cout<<\~base(){ cout<<\

derived(){cout<<\~derived(){ cout<<\

运行结果为___________________________。

constructing base! constructing derived! destructing derived! destructing base!

9.有如下程序: #include class base { protected: int x; public: base(int x1)

{ x=x1;cout<<\};

class base1:virtual public base {

int y; public:

base1(int x1,int y1):base(x1) { y=y1;cout<<\};

class base2:virtual public base { int z; public:

base2(int x1,int z1):base(x1) { z=z1;cout<<\};

class derived:public base1,public base2 { int xyz; public:

________________________________________ { xyz=xyz1;cout<<\}; void main()

{derived obj(1,2,3,4);} 输出结果为: x=1 y=2 z=3 xyz=4

请将程序补充完整。

10.运行下列程序的结果为_______________________。

# include class vehicle { };

class car:public vehicle { };

class truck:public vehicle { }; void main() { }

三、编程题

1.编写一个输出学生和教师数据的程序,学生数据有编号、姓名、年龄、班号和成绩;教师数据有编号、姓名、年龄、职称和部门。要求声明一个person类,并作为学生数据操作

vehicle obj,*ptr; car obj1; truck obj2; ptr=&obj; ptr->message(); ptr=&obj1; ptr->message(); ptr=&obj2; ptr->message(); int goods; void message(){

cout<<\public:

int passengers; void message(){ cout<<\public:

int wheels; float weight; void message()

{cout<<\

public:

类student和教师数据操作类teacher的基类。

【参考答案】 一、选择题 1. b 2. a 3. a 4. a 5. c 6. b 7. a 8. c

二、填空题 1. 私有继承 2. 私有 3. 保护

4. 基类、对象成员所在类、派生类 5. 成员初始化列表 6. 二义性 7. base::f() 8. constructing base!

constructing derived! destructing derived! destructing base!

9. derived(int x1,int y1,int z1,int xyz1):base(x1),base1(x1,y1),base2(x1,z1)

其中参数名可以为任意合法变量名。 10. vehicle message

vehicle message vehicle message

三、编程题 1. 参考程序如下: #include #include class person {protected:

};

char name[10]; int age;

person(char n[],int a) { }

void disp() { }

cout<<\ 姓 名:\cout<<\ 年 龄:\strcpy(name,n); age=a;

public:

class teacher : public person { };

class student : public person {

char sid[12]; char cnum[12];

char tid[10]; char dept[20]; char post[10];

teacher(char *s1,char *s2,int i,char *s3,char *s4):person(s2,i) { }

void disptech() { }

cout<<\ 编 号:\person::disp();

cout<<\ 工作部门:\cout<<\ 职 称:\strcpy(tid,s1); strcpy(dept,s3); strcpy(post,s4);

public:

};

double score;

student(char *s1,char *s2,int a, char *s3,double i):person(s2,a) { }

void dispstu() {

cout<<\ 学 号:\person::disp();

cout<<\ 班 级:\cout<<\ 成 绩:\strcpy(sid,s1); strcpy(cnum,s3); score=i;

public:

int main() { }

teacher t1(\张伟\信息学院\教授\student s1(\李涛\t1.disptech(); s1.dispstu(); return 0;