类与对象——实验二

【实验目的】
1、掌握类的构造函数和析构函数的概念和使用方法;
2、掌握对象数组、对象指针的定义和使用方法;
3、掌握new和delete的使用方法;
【实验内容】
1、 设计描述平面坐标上的点CPoint类,该类满足下述要求:
•具有x,y坐标信息;
•具有带默认形参值的构造函数,参数分别用于初始化x和y坐标信息;
•具有获取x、y信息的GetX和GetY函数,具有设置x、y信息的SetX和SetY函数;
2、 设计一个矩形类CRectangle,该类满足下述要求:
•具有矩形的左下角和右上角两个点的坐标信息,这两个点的数据类型是CPoint;
•具有带参数的构造函数CRectangle(const CPoint &, const CPoint &),参数分别用于设置左下角和右上角两个点的坐标信息;
•具有设置左下角和设置右上角的两个点坐标的功能SetLPoint(const CPoint &)和SetRPoint(const CPoint &);
•具有获得周长(GetPerimeter)和获得面积(GetArea)的功能。
3、 在main函数中,完成以下工作:
•动态创建一个CRectangle类的对象a_rectagnle,其初始的左下角和右上角坐标分别为(2,5)、(6,8);调用GetPerimeter和GetArea获得矩形周长和面积,并将周长和面积显示在屏幕上;
•调用SetLPoint设置a_rectagnle的左下角为(4,6),调用SetRPoint设置a_rectagnle的右上角为(7,9);调用GetPerimeter和GetArea获得矩形周长和面积,并将周长和面积显示在屏幕上;
•销毁该动态创建的对象。
【实验要求】
1、编写实验内容要求的程序、编译并调试通过;
2、实验报告中记录编程过程中出现的错误与改正方法;
3、总结类的构造函数和析构函数的特点;
源代码如下:

#include <iostream>
using namespace std;
class Cpoint
{public:
     /*Cpoint (float a=0,float b=0):x(a),y(b){}    构造函数初始化方法一*/
	Cpoint(float c=0,float d=0)//方法二
    {
	this->x=c;
	this->y=d;
    }
    float GetX(){return x;}
    float GetY(){return y;}
    void SetX(float m){ this->x=m;}
    void SetY(float n){ this->y=n;}

private:
	float x,y;
};
class CRectangle
{public:
	CRectangle(const Cpoint &a,const Cpoint &b)//变量a为 Cpoint中c的引用,变量b为Cpoint中d的引用 
	{
		lbPoint =a;
		raPoint =b;
	} 
	void SetLPoint(const Cpoint &l)// 
	{
		lbPoint = l;
	}
	void SetRPoint(const Cpoint &r)// 
	{
	     raPoint =r;	
	}
	float GetPerimeter()
	{
		return (raPoint.GetX()-lbPoint.GetX()+raPoint.GetY()-lbPoint.GetY())*2;//计算周长 
	}
	float GetArea()
	{
		return (raPoint.GetX()-lbPoint.GetX())*(raPoint.GetY()-lbPoint.GetY());//计算面积 
	}
private:
    Cpoint lbPoint,raPoint; 
};
int main()
{
	Cpoint p1(2,5),p2(6,8);
	CRectangle *a_rectagnle = new CRectangle(p1,p2);  //利用new动态创建一个CRectangle类的对象a_rectagnle
	cout<<"矩形的周长: "<<a_rectagnle-> GetPerimeter() <<endl;
	cout<<"矩形的面积: "<<a_rectagnle-> GetArea()<<endl;
	p1.SetX(4);
	p1.SetY(6);
	p2.SetX(7);
	p2.SetY(9);
	a_rectagnle->SetLPoint(p1);//调用SetLPoint设置a_rectagnle的左下角为(4,6)
	a_rectagnle->SetRPoint(p2);//调用SetRPoint设置a_rectagnle的右上角为(7,9)
	cout<<"改变的矩形周长:"<<a_rectagnle->GetPerimeter()<<endl;
	cout<<"改变的矩形面积:"<<a_rectagnle->GetArea()<<endl;
	delete  a_rectagnle; //销毁动态创建的对象a_rectagnle
	return 0;
} 

2.总结类的构造函数和析构函数的特点
答: 构造函数: (1)构造函数是成员函数,函数体可写在类体内,也可写在类体外。(2)构造函数是一个特殊的函数,该函数的名字与类名相同,该函数不指定类型说明,它有隐含的返回值,该值由系统内部使用。该函数可以有一个参数,也可以有多个参数。(3)构造函数可以重载,即可以定义多个参数个数不同的函数。(4)程序中不能直接调用构造函数,在创建对象时系统自动调用构造函数。(5)一个类没有定义任何构造函数,则编译器自动生成一个不带参数的缺省构造函数,其格式如下: 类名::缺省构造函数名(){ }
在程序中定义一个对象而没有指明初始化,则编译器便按缺省构造函数来初始化该对象,对象的所有数据成员都初始化为零或空。

析构函数:(1)析构函数是一个特殊的成员函数,与类同名,并在前面加“~”字符,用来与构造函数加以区别。析构函数不指定数据类型,并且也没有参数。(2)一个类中只能定义一个析构函数,析构函数不能重载。(3)析构函数可以被程序调用,也可以由系统自动调用。
两种情况析构函数会被自动调用。一是如果一个对象被定义在一个函数体内,则当这个函数结束时,该对象的析构函数被自动调用;二是当一个对象是使用new运算符被动创建的,在使用delete运算符释放它时,delete将会自动调用析构函数。
(4)一个类中没有定义析构函数时,则编译系统也生成一个缺省析构函数,其格式如下:
类名::~缺省析构函数名(){}缺省析构函数是一个空函数

借鉴https://blog.csdn.net/iteye_7285/article/details/82542681,小部分有删改。
3.心得体会
比较实验一作业,这次难度明显提升。明确作业意图写出大概代码框架之后,借鉴网络上已有此类似题目时仍然有部分代码不能完全理解,感觉知识点还是没有完全掌握,思路不大清晰。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值