实验二类与对象
实验目的和要求
1.掌握类、类的数据成员、类的成员函数的定义方式。
2.理解类成员的访问控制方式。
3.掌握对象的定义和操作对象的方法。
4.理解构造函数和析构函数的定义与执行过程。
5.掌握重载构造函数的方法。
6.了解拷贝构造函数的定义方法。
实验内容
1.下面程序中有错,在不删除和增加代码行的情况下,改正错误语句,使其正确运行。#include
class Aa
{
public:
Aa(int i=0)
{
a=i;
cout<<"Constructor "< } ~Aa() { cout<<"Destructor "< } void print() { cout< } private: int a; }; int main() { Aa al(1),a2(2); al.print(); cout< return 0; } 2.检查下面的程序,找出其中的错误,并改正。然后上机调试,使程序能正常运行。 (1) #include class Date { void set_date(); void show_date(); int year; int month; int day; }; Date d; int main() { set_date(); show_date(); } void set_date() { cin>>d.year; cin>>d.month; cin>>d.day; } void show_date() { cout< (2) #include class A { public: void A(int i=0) { m=i; } void show() { cout< } void ~A(){} private: int m; }; int main() { A a(5); a.m+=10; a.show(); return 0; } (3) #include { private: int a=0; int &b; void setA(int i) { a=i; } X(int i) { a=i; } public: int X() { a=b=0; } X(int i,int j) { a=i; b=j; } void setC(int k) { c=c+k; } }; void main() { X x1; X x2(2); X x3(1,2); x1.setA(3); } 3.调试下列程序。 #include class TPoint { private: int X,Y; public: TPoint(int x,int y) { X=x; Y=y; cout<<"Constructor is called"< } TPoint(TPoint &p); ~TPoint() { cout<<"Destructor is called"< int getx() { return X; } int gety() { return Y; } }; TPoint::TPoint(TPoint &p) { X=p.X; Y=p.Y; cout<<"Copy-initialization Constructor is called"< } void main() { TPoint p1(4,9); TPoint p2(p1); TPoint p3 = p2; cout<<"p3=("< } (1)写出程序的输出结果,并解释输出结果。 (2)按下列要求进行调试: 在主函数体内,添加下列说明语句: TPoint p4,p5(2); 调试程序会出现什么现象?为什么?如何解决?(提示:对已有的构造函数进行适当修改)结合运行结果分析如何使用不同的构造函数创建不同的对象。 (3)在主函数内使用new创建不同参数动态两个动态对象,输出其坐标,并用delete 删除之。运行程序,分析运行结果。 (4)在程序中定义个全局对象,在主函数最前添加语句: cout<<"Enter main"< 运行程序,分析运行结果。 4.完善程序,并写出运行结果 根据程序要求,完善程序后输入源程序,编译连接,并写出运行结果。 如果某个自然数除了1和它本身外还有其他因子,则这个自然数就是合数(非素数)。试定义一个类NUM,从3开始向上试探找出n个连续的自然数,且它们都是合数。当找到第一组连续的n个合数后,即停止查找。 具体要求如下: (1)私有成员 int n : 存放满足条件的连续自然数的个数。 int *p: 根据n的值申请一个动态数组用来存放求出的满足条件的n个自然数。 (2)公有成员函数 NUM(int n1): 构造函数,用n1初始化n,根据n的值申请动态数组空间,使p指向该动态数组空间。 int yes(int x): 判断x是否为合数。如果是,返回1,否则返回0。 void fun(): 从3开始向上试探找出n个连续的自然数,且它们都是合数,并依次存入动态数组。 void print(): 输出满足条件的n个合数。 ~NUM(): 析构函数,释放动态数组所占用的存储空间。 (3)在主函数中定义一个NUM类的对象num,求出10个连续的合数。然后通过对象num调用成员函数求出10个连续的合数,并输出计算结果。 #include class NUM { //定义数据类NUM private: int n; int *p; public: NUM(int n1) { n=n1; p= ; //动态分配存放连续合数的存储空间 } int yes(int x) { for(int i=2;i<=x/2;i++) if (x%i==0) return 1; return 0; } void fun(void) { int j; for(int i=3;1;i++) { j=0; while( &&j { p[j]=i; j++; i++; } if(j==n) break; } } void print(void) { cout<<"找到的"< for(int i=0;i cout< cout< } ~NUM() { ; //释放在构造函数中申请的存储空间 } }; void main() { cout<<"请输入要求的连续合数的个数(例如10):"; int n; cin>>n; NUM num(n); ; //寻找连续的合数,并存入动态申请的存储空间中 ; //输出寻找到的合数 } 5.请定义一个矩形类(Rectangle),私有数据成员为矩形的长度( len)和宽度(wid),缺省构造函数置len和wid为0,有参构造函数置len和wid为对应形参的值,另外还包括求矩形周长、求矩形面积、取矩形长度和宽度、修改矩形长度和宽度为对应形参的值、输出矩形尺寸等公有成员函数。要求输出矩形尺寸的格式为“length:长度,width:宽度”。编写主函数对定义的类进行测试。 6.声明一个时间类,时间类中有3个私有数据成员(Hour,Minute,Second)和两个公有成员函数(SetTime和PrintTime)。SetTime根据传递的3个参数为对象设置时间;PrintTime负责将对象表示的时间显示输出,输出格式为“Hour:Minute:Second”。 (1)在主函数中,建立一个时间类的对象,设置时间为9点20分30秒并显示该时间。 (2)使用构造函数代替上面的SetTime成员函数,并在主函数中使用构造函数设置时间为10点40分50秒,并显示该时间。 (3)重载时间类的构造函数(不带参数)使小时、分、秒均为0。 (4)在时间类的析构函数中输出"Good bye!” (5)定义拷贝构造函数并调用。 7.下面是一个整型链表类intList的声明,请给出该类所有数据成员的类外定义,并在主函数中测试该类。 class intList { protected: struct Node { int data; Node *next; }; Node *L; public: intList(); //构造函数 ~intList(); //析构函数 bool Insert(int i,int elem); bool Remove(int i,int &elem); //删除链表的第i个位置的元素,删除成功返回true,失败返回false int Find(int elem); //在链表中查找值为elem的元素,找到返回该元素在链表中的位置,否则返回0 int Length(); //返回链表长度(元素个数) void PrintList(); //输出链表 }; 参考答案(非权威,仅仅是我自己的理解,如有错误,欢迎批评指正!) 第一题: #include class Aa { public: Aa(int i=0) { a=i; cout<<"Constructor "< } ~Aa() { cout<<"Destructor "< } void print() {