OOP技术:面向对象技术1-10章习题

OOP技术:习题

第1章习题

1. 什么是面向对象技术?

2. 面向对象与面向过程程序设计有什么不同?

3. 面向对象技术有哪些优点?

4. 面向对象技术中的封装性有何优缺点?如何克服这些缺点?

5. 为什么要应用继承机制?

6. C++对多态性的支持体现在哪些方面?

7. 目前常用的面向对象程序设计语言有何异同?

8. 什么是.NET?

第2章习题

1. 写出下面程序的运行结果。

#include

void main()

{

int* a;

int* &p=a;

int b=10;

p=&b;

cout<<*a<

cout<<*p<

}

2. 写出下面程序的运行结果。

#include

void main()

{

int iarray[10]={0,2,4,6,8,10,12,14,16,18};

int sum=0;

int* iptr=iarray;

for(int i=0;i<10;i++)

{

sum+=*iptr;

iptr++;

}

cout<<"sum is"<

}

3. 写出下面程序的运行结果。

#include

int m=8;

int add3(int x,int y=7,int z=m)

{ return x+y+z; }

void main()

{

int a=1,b=2,c=3;

cout<

cout<

}

4. 编程求所有的水仙花数。如果一个三位数的个位数、十位数和百位数的立方和等于该数本身,则称该数为水仙花数。

5. 编程求1000以内所有素数。

6. 编写一个可以打印任何一年日历的程序。

7. 在10000以内验证哥德巴赫猜想之“1+1”命题:任意大的偶数,都可以表示为两个素数之和。

8. 编写一个函数,用冒泡法对输入的十个整数从小到大排序。

9. 编写一个函数,输入一个十六进制数,输出相应的十进制数。

10. 将给定的一个二维数组(3×3)转置,即行列互换。

11. 用非递归的函数调用方式求fibonaci数列第n项。fibonaci数列形如:

0,1,1,2,3,5,8,13,┄

其通项为:F0=0;F1=1;┄;F n=F n-1+F n-2。

12. 编写重载函数max,分别返回字符数组、int数组、long数组、float数组、double 数组和字符串数组的最大元素。

第3章习题

1. 类定义由哪些部分组成?在定义和使用时要注意什么问题?

2. 说明一个类的公有成员、保护成员和私有成员的区别。

3. 何时执行类构造函数及析构函数?若该对象作为类的成员,何时执行其构造函数和析构函数?

4. 创建一个Employee类,该类中有字符数组,表示姓名、街道地址、市、省和邮政编码。其功能有修改姓名、显示数据信息。要求其功能函数的原型放在类定义中,构造函数初始化每个成员,显示信息函数要求把对象中的完整信息打印出来。其中数据成员为保护的,函数为公有的。

5. 修改第4题中的类,将姓名构成Name类,其名和姓在该类中为保护数据成员,其构造函数为接受一个指向完整姓名字符串的指针。该类可显示姓名。然后将Employee类中的姓名成员(字符数组)修改为Name类对象。

6. 改正下列程序中的错误,并说明理由。

程序1:

include ;

class Student

{

public

void Student()

void display()

{

cin<<'number:'<

cout<

cout<

private:

int number,char* name,float score;

}

程序2:

include ;

class example()

{

private:

int date;

static int count

public;

void example(int y=10)(date=y;)

(

cout<<"date="<

return count;

)

}

7. 写出下面程序的运行结果。注意:构造函数和析构函数的执行次序、构造函数的初始化表。

#include

class Ex

{

public:

Ex(int x,char c='c');

~Ex()

{

cout<<'B'<

}

void outdata(void)

{

cout<

}

private:

int da;

char ch;

};

void main()

{

Ex x(3,'a'),y(1);

Ex z[2]={Ex(10,'a'),Ex(1,'d')};

x.outdata();

y.outdata();

z[0].outdata();

}

Ex::Ex(int x,char c):da(x),ch(c) {

cout<<'A'<

}

8. 写出下面程序的运行结果。

#include

#include

#include

class Ex

{

public:

Ex(const char* s)

{

len=strlen(s);

p=new char[len+1];

strcpy(p,s);

}

Ex()

{

p=new char[8];

cout<<"****"<

}

Ex(const Ex& st)

{

len=strlen(st.p);

p=new char[len+1];

strcpy(p,st.p);

}

~Ex()

{

delete p;

}

void outdata(void)

{

printf("%x:%d ,%x:%s\n",&len,len,&p,p);

}

private:

int len;

char* p;

};

void main()

{

Ex x("first");

Ex y=x,z;

x.outdata();

y.outdata();

}

9. 写出下面程序的运行结果。

#include

class MyClass

{

public:

MyClass();

MyClass(int);

void Display();

~MyClass();

protected:

int number;

};

MyClass::MyClass()

{

cout<<"Constructing normally\n";

}

MyClass::MyClass(int m)

{

number=m;

cout<<"Constructing with a number:"<

}

void MyClass::Display()

{

cout<<"Display a number:"<

}

MyClass::~MyClass()

{

cout<<"Destructing\n";

}

void main()

{

MyClass obj1;

MyClass obj2(10);

obj1.Display();

obj2.Display();

}

10. 什么是静态数据成员?它有何特点?

11. 编写一个类,声明一个数据成员和一个静态数据成员。其构造函数初始化数据成员,并把静态数据成员加1,其析构函数把静态数据成员减1。

(1)编写一个应用程序,创建该类的3个对象,然后显示其数据成员和静态数据成员,再析构每个对象,并显示它们对静态数据成员的影响。

(2)修改该类,增加静态成员函数并访问静态数据成员,并声明静态数据成员为保护成员。体会静态成员函数的使用,静态成员之间与非静态成员之间互访问题。

12. 假设有两个类Student和Score,使用时,怎样允许Score成员访问Student中的私有成员和保护成员?

13. 为什么要定义友元?友元有哪几种类型?

14.改正下面代码的错误。

#include

class Animal;

void SetValue(Animal&,int);

void SetValue(Animal&,int,int);

class Animal

{

public:

friend void setValue(Animal&,int);

protected:

int itsWeight;

int itsAge;

};

void SetValue(Animal& ta,int tw)

{

ta.itsWeight=tw;

}

void SetValue(Animal& ta,int tw,int tn)

{

ta.itsWeught=tw;

ta.itsAge=tn;

}

void main()

{

Animal peppy;

SetValue(peppy,5);

SetValue(peppy,7,9);

}

将第14题程序中的友元改成普通函数,为此增加访问类中保护数据的成员函数。

第4章习题

1. 什么是继承?它在软件设计中有什么作用?

2. 比较类的三种继承方式之间的差别。

3. 如果派生类B已经重新定义了基类A的一个成员函数fn1(),没有定义重载成员函数fn2(),怎样调用基类的成员函数fn1()、fn2()?

4. 写出运行结果,分析程序中的访问权限,并回答所列问题。

#include

class A

{

public:

void f1();

A()

{

cout<<"A Constructor"<

i1=10;j1=11;

cout<<"i1="<

}

~A(){cout<<"A Destructor"<

protected:

int j1;

private:

int i1;

};

class B:public A

{

public:

void f2();

B()

{

cout<<"B Constructor"<

i2=20;j2=21;

cout<<"i2="<

}

~B(){cout<<"B Destructor"<

int j2;

private:

int i2;

};

class C:public B

{

public:

void f3();

C()

{

cout<<"C Constructor"<

i3=30;j3=31;

cout<<"i3="<

}

~C(){cout<<"C Destructor"<

int j3;

private:

int i3;

};

void main()

{

A a;

B b;

C c;

}

(1)派生类B中成员函数f2()能否访问基类A中的成员f1()、i1和j1?

(2)派生类B的对象b能否访问基类A中的成员f1()、i1和j1?

(3)派生类C中成员函数 f3()能否访问直接基类 B中的成员 f2()、j2和i2?能否访问间接基类A中的成员f1()、j1和i1?

(4)派生类C的对象c能否访问直接基类B中的成员f2()、i2和j2呢?能否访问间接基类A中的成员f1()、j1和i1?

(5)根据上述结果总结继承中构造函数和析构函数的调用顺序。

(6)将派生B类的继承方式改为私有继承和保护继承,结果分别怎样?试总结它们的异同。

5. 写出下面程序的运行结果。

#include

class A

{

public:

A(int i,int j){a=i;b=j;}

void move(int x,int y){a+=x;b+=y;}

void show()

{

cout<<"("<

}

private:

int a,b;

};

class B:public A

{

public:

B(int i,int j,int k,int l):A(i,j),x(k),y(l){}

void show()

{

cout<

}

void fun(){move(3,5);}

void f1(){A::show();}

private:

int x,y;

};

void main()

{

A aa(1,2);

aa.show();

B bb(3,4,5,6);

bb.fun();

bb.A::show();

bb.B::show();

bb.f1();

}

6. 编写一个学生和教师数据输入和显示程序。学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。要求将编号、姓名输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。

7. 写出下面程序的运行结果,并分析总结。

#include

class Base

{

public:

void who(){cout<<"Base class"<

};

class Derive1:public Base

{

public:

void who(){cout<<"Derivel class"<

};

class Derive2:public Base

{

public:

void who(){cout<<"Derive2 class"<

};

void main()

{

Base obj1,*p;

Derive1 obj2;

Derive2 obj3;

p=&obj1;

p->who();

p=&obj2;

p->who();

p=&obj3;

p->who();

obj2.who();

obj3.who();

9. 在多继承方式下,派生类的构造函数和析构函数调用顺序是怎样的?

10. 什么是虚基类?有何作用?

第5章习题

1. 什么是多态性?在C++中是如何实现多态的?

2. 虚函数与重载在设计方法上有何异同?

3. 编写一个时间类,实现时间的加、减、读和输出。

4. 定义一个哺乳动物Mammal类,再由此派生出狗Dog类,两者都定义Speak成员函数,基类中定义为虚函数,定义一个Dog类的对象,调用Speak函数,观察运行结果。

5. 写出下面程序的运行结果,并回答问题。

#include

class Point

{

public:

Point(int x1,int y1){x=x1;y=y1;}

int area() const {return 0;}

private:

int x,y;

};

class Rect:public Point

{

public:

Rect(int x1,int y1,int u1,int w1): Point(x1,y1)

{

u=u1;w=w1;

}

int area() const {return u*w;}

private:

int u,w;

};

void fun(Point &p)

{

cout<

}

void main()

{

Rect rec(2,4,10,6);

fun(rec);

如果将Point类的area()函数定义为虚函数,其运行结果是什么?为什么?

6. 在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?有何用途?

7. 什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?

8. 定义一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea()函数计算对象的面积,GetPerim()函数计算对象的周长。使用Rectangle类派生一个新类Square。

9. 写出下面程序的运行结果,并回答问题。

#include

class A

{

public:

A(int i):k(i){}

virtual void operator!()

{

cout<<"A: K="<

}

protected:

int k;

};

class B:public A

{

public:

B(int n=0):A(0),j(n){k++;}

virtual void operator!()

{

cout<<"B: K="<

}

protected:

int j;

};

class C:public B

{

public:

C(int n=0):B(0),m(n){k++;j++;}

virtual void operator!()

{

cout<<"C: K="<

}

private:

int m;

};

void main()

{

B b(5);

C c(3);

A a(2);

A* ab=&a;

!*ab;

!b;

!c;

A &ba=(A)b;

!ba;

A &ca=(B)c;

!ca;

B &cb=c;

!cb;

}

如果将类A的虚函数定义为普通成员函数,其结果如何?为什么?如果将C类改为A类的公有派生类,应做如何修改才能使程序正常运行?

10. 前缀自加和后缀自加运算符重载时如何区别?

第6章习题

1. 编写一个函数模板,实现求不同类型的数的相反数。

2. 编写一个函数模板,实现对不同类型的数组排序。

3. 以下是一个整数链表类的定义:

const int maxqueue=10;

class List

{

public:

List();

~List();

void Add(int);

void Remove(int);

int* Find(int);

void PrintList();

protected:

struct Node

{

Node* pNext;

int* pT;

};

Node* pFirst; //链首节点指针

};

(1)编写一个链表的类模板(包括其成员函数定义),让任何类型的对象提供链表结构数据操作。

(2)在应用程序中创建整数链表、字符链表和浮点数链表,并提供一些数据插入链表,在链表中删除一个节点和打印链表所有节点元素,遍历整个链表查找给定对应节点等操作。

第7章习题

1. 什么是流? C++中用什么方法实现数据的输入/输出?

2. C++的I/O流库由哪些类组成?其继承关系如何?

3. C++中进行格式化输入/输出方法有哪几种? 各是如何实现的?

4. 写出下面程序的运行结果。

#include

void main()

{

int x=77;

cout<<"12345678901234567890\n";

cout.fill('#');

cout.width(10);

cout<<"x=";

cout.width(10);

cout.setf(ios::left);

cout.fill('$');

cout<

int y=0x2a;

cout<<"12345678901234567890\n";

cout.unsetf(ios::left);

cout.fill('%');

cout.width(10);

cout<<"y=";

cout.unsetf(ios::right);

cout.width(10);

cout.setf(ios::left);

cout.fill('$');

cout<

}

5. 写出下面程序的运行结果。

#include

#include

void main()

{

int a=5,b=7,c=-1;

float x=67.8564,y=-789.124;

char ch='A';

long n=1234567;

unsigned u=65535;

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<

cout<<"%%"<

cout<

cout<

cout<

cout<

cout<

cout<

cout<<"COMPUTER"<<","<<"COMPUTER"<

}

6. 编写一个程序,从键盘上输入一个八进制数,要求分别以八进制、十进制、十六进制(其中的字母要大写)形式左对齐方式输出,格式如下:

Hex Decimal Octal

xxx xxx xxx

7. 编写一个程序,分别计算并输出6!至15!的值,用setw()控制“=”左右边数值的宽度,使输出结果排列整齐。要求分别以浮点和定点两种形式输出。

8. 编写一个程序,打印2~100之间数字的自然对数与以10为底的对数表。要求对表进行格式化,使数字可以显示在宽度为10的范围内,用小数位数占5位的精度进行右对齐。

9.编写一个程序,从键盘上输入5个学生的数据(包括学号、姓名、年龄、三门功课的分数),然后求出每个人的平均分数,把学号、姓名和平均分数输出到磁盘文件STUD.REC中,

最后从STUD.REC文件中读出这些数据,并在屏幕上显示出来。

第8章习题

1. 列出五个常见的异常例子。

2. 写出下面程序的运行结果。

#include

void main()

{

int wait_time=46;

try

{

cout<<"Try block entered."<

if (wait_time>30)

throw wait_time;

cout<<"Leaving try block."<

}

catch(int thrown_value)

{

cout<<"exception thrown with"<

<<"wait_time equal to"<

}

cout<<"After catch block."<

}

如果将“int wait_time=46;”替换成“int wait_time=12;”,其结果如何?

3. 创建一个含有可抛出异常的成员函数的类,在该类中,创建一个被嵌套的类用作一个异常对象,它带有一个char*参数,该参数是一个有意义的字符串。创建一个可抛出该异常的成员函数。编写一个try块使它能调用该函数并且捕获异常,以打印该字符串的方式处理该异常。

第9章习题

1. 在应用程序向导AppWizard中能够创建哪些类型的文件?

2. MFC类库的层次结构怎样?将9.2节中表9-5至9-10的内容用层次结构表达出来。

第10章习题

1. MFC应用程序是如何实现Windows消息机制的,请详细解释。

2. 什么是文档模板?

3. 当应用程序向导生成MFC应用程序时,在源代码中找不到WinMain()函数,这是为

什么?

4. 文档类、文档模板类和视图类的结构是如何定义的?

5. 修改DlgDemo程序,使用如图10-27所示的对话框实现作图图形的选择。

OOP技术:面向对象技术1-10章习题

图10-27 用于选择作图图形的对话框

第11章习题

1. 在MFC中,构成多文档应用程序的类有哪些?它们的功能是什么?

2. 多文档应用程序中的多种文件类型和多菜单是怎样实现的?

第12章习题

1. 基于表单的应用程序的特点是什么?

2. 修改12.2.2节中的示例程序,设计一个能计算加、减法的计算器。

相关推荐
相关主题
热门推荐