C++实训实验题(4)

一.类、对象与继承实例

1.点类
定义平面点类 POINT,点的 x,y 坐标是其数据成员,double 类型,私有;成员函数有 set()设置点的 x,y 坐标,distance()计算和另一个点的距离,show()显示坐标的位置信息。成员函数均为公有。编写主函数,使用 POINT 类定义两个点对象,输入并设置两个点的坐标,显示依次两个点的坐标信息,计算并显示两个点的距离。
代码如下:

#include<iostream>
#include<cmath>
using namespace std;
class POINT
{
private:double x,y;
public:
void set(double a, double b);  //设置点x,y的坐标
  void show();     //显示坐标位置信息
  double distance(POINT b);  //计算距离
};
int main()
{
POINT a, b;        //定义点的对象
 double x, y;
 cin>>x>>y;       //输入点x,y的坐标
 a.set(x,y);            //设置a点坐标
 cin>>x>>y;
 b.set(x,y);
 a.show(); cout<<endl;
 b.show(); cout<<endl;    //显示a,b点坐标
 cout<<a.distance(b)<<endl;
 return 0;
}
//三个成员函数
void POINT::set(double a,double b)
{
x=a;
y=b;
}
void POINT::show()   //显示点
{
 cout<<"("<<x<<","<<y<<")"<<endl;  //显示点的坐标 
}
double POINT::distance(POINT b)   //计算距离 
{
double s=sqrt((x-b.x)*(x-b.x)+(y-b.y)*(y-b.y));
return s;
}

2.带构造函数的点类

定义平面点类POINT,点的 x,y 坐标是其数据成员,double 类型,私有;成员函数有默认构造函数,带两参数x,y 坐标的构造函数, distance()计算和另一个点的距离,show()显示坐标的位置信息。成员函数均为公有,默认构造函数将点的坐标设为(0,0)。编写主函数,输入两个点的坐标并由此定义两个点对象,依次两个点的坐标信息,计算并显示两个点的距离。
代码如下:

#include<iostream>
#include<cmath>
using namespace std;
class POINT
{
double x,y;
public:POINT()
{x=0,y=0;}
POINT(double x0,double y0){
x=x0,y=y0;
}
void set(double x0,double y0);
double distance(POINT a);  //计算距离
void show();  //显示位置信息
double getx()
{
return x;
}
double gety()
{
return y;
}
};
double POINT::distance(POINT a)  //析构函数
{
return sqrt((x-a.getx())*(x-a.getx())+(y-a.gety())*(y-a.gety())); //求出两点之间的距离
}
void POINT::show()  //point的成员函数被显示
{
cout<<"("<<x<<","<<y<<")"<<endl;
}
int main()
{
double x,y;
cin>>x>>y;
POINT a(x,y);  //调运析构函数定义的对象a
cin>>x>>y;
POINT b(x,y);  //调用析构函数定义对象b
a.show();
b.show();
cout<<a.distance(b)<<endl;  
return 0;}

3、带拷贝构造函数和析构函数的矩形类
定义矩形类 RECT,两个对角顶点坐标是其数据成员(mX1, mY1, mX2,mY2),int 类型,私有;成员函数有默认构造设置所有数据成员值为 0,四参数构造函数设置两个顶点坐标,拷贝构造函数,set()设置两个顶点坐标,area()计算面积,perimeter()计算周长,showinfo()显示两个顶点信息,show()显示由“”组成的矩形(宽是矩形的宽度,高是矩形的高度),析构函数。成员函数均为公有,析构函数中显示两个顶点信息和字符串“deconstruct”。编写主函数,使用RECT 类定义一个矩形类对象a(默认构造),输入并设置矩形的两个顶点,显示矩形的成员信息,计算并显示矩形的周长和面积,显示由“”组成的矩形;由刚输入的顶点向右平移 2 单位构造对象 b,再由对象 b 构造对象 c,显示矩形 c 的成员信息,计算并显示矩形 c 的周长和面积,显示由“*”组成的矩形c。

提示:矩形图形显示函数如下:
void show()
{for (int i = 0; i < (abs(mY2 - mY1)); ++i)
{for (int j = 0; j < (abs(mX2 - mX1)); ++j)
cout << “*”;
cout << endl; } }
析构函数参考如下:~Rect() { cout << “(” << mX1 << “,” << mY1 << “,” << mX2 << “,” << mY2 << “)deconstruct” << endl; }

#include<iostream>
#include <cmath>
using namespace std;
class RECT
{
public:
RECT()
{
this->mx1=0;  //初始值
    this->my1=0;
    this->mx2=0;
    this->my2=0;
}
RECT(int a,int b,int c,int d)
 {
  this->mx1=a;  //赋值  this表示本对象的指针
  this->my1=b;
  this->mx2=c;
  this->my2=d;
   }
   RECT(RECT &r)  //拷贝构造函数 类名(类名&对象名)
 {
     this->mx1=r.mx1;
  this->my1=r.my1;
  this->mx2=r.mx2;
  this->my2=r.my2;
 }
void set(int a1,int b1,int c1,int d1)  //设置数值
 {
 this->mx1=a1;
 this->my1=b1;
 this->mx2=c1;
 this->my2=d1;
 }
 int area()
 {
  int s;
  s=(abs(this->mx2-this->mx1)*abs(this->my2-this->my1));
 return s;   //求面积
 }
 int perimeter()
 { 
 int l;
 l=2*(abs(this->mx2-this->mx1)+abs(this->my2-this->my1));
 return l;  //求周长
 }
  void showinfo()  //输出信息
   {
   cout<<"("<<this->mx1<<","<<this->my1<<","<<this->mx2<<","<<this->my2<<")"<<endl;
   }
   void show()  //矩形图形显示函数
   {
   for(int i=0;i<(abs(this->my2-this->my1));i++)
   {
     for(int j=0;j<(abs(this->mx2-this->mx1));j++)
   cout<<"*";
     cout<<endl;
     }
   }
   ~RECT()  //析构函数  释放对象占用的空间
   {
    cout<<"(" <<mx1<<"<"<<my2<<","<<mx2<<","<<my2<<") deconstruct"<<endl;
   }
   private:
 int mx1;
 int my1;
 int mx2;
 int my2;
};
int main()
{
RECT a;  //定义矩形类对象a 默认构造
double x1,x2,y1,y2;  //矩形两顶点
cin>>x1>>y1>>x2>>y2;
a.set(x1,y1,x2,y2);  //设置
a.showinfo();
cout<<endl;  //显示矩形顶点信息
cout<<a.perimeter()<<endl;
cout<<a.area()<<endl;
a.show();   //显示由*组成的矩形 
RECT b(x1+2,y1,x2+2,y2); // 输入顶点定义对象b 使用四参数构造函数
RECT c(b);
//由对象b定义对象c 使用拷贝构造函数
c.showinfo();
cout<<endl;
cout<<c.perimeter()<<endl;
cout<<c.area()<<endl;
c.show();
return 0;

知识补充:
析构函数:
1.析构函数的功能是当对象被撤销时,释放该对象占用的内存空间
析构函数没有返回值,没有参数,每个类只有一个析构函数。析构函数的函数名的类名前加~。
2.析构函数的手工调用:
语法如下:
对象名.类名::析构函数名
而构造函数只能由系统调用,不能用上述方法调用。

猜你喜欢

转载自blog.csdn.net/Yangye_1018/article/details/107344383
今日推荐