带拷贝构造函数和析构函数的矩形类(C++)

题目详情
定义屏幕矩形类RECT,边和坐标轴平行,两个对角顶点坐标是其数据成员,int类型,私有;成员函数有默认构造设置所有数据成员值为0,四参数构造函数设置两个顶点坐标,拷贝构造函数,set()设置两个顶点坐标,area()计算面积,perimeter()计算周长,showinfo()显示两个顶点信息,show()显示由“*”组成的矩形(宽是矩形的宽度,高是矩形的高度),析构函数。成员函数均为公有,析构函数中显示两个顶点信息和字符串“deconstruct”。

编写主函数,使用RECT类定义一个矩形类对象a(默认构造),输入并设置矩形的两个顶点,显示矩形的静态成员信息,计算并显示矩形的周长和面积,显示由“*”组成的矩形;由刚输入的顶点向右平移2单位构造对象b,再由对象b构造对象c,显示矩形c的静态成员信息,计算并显示矩形c的周长和面积,显示由“*”组成的矩形c。主函数和运行结果如下:

输入:两个顶点的坐标,用空格隔开。

输出:见样例,其中最后三行是析构函数的输出,每行是一个对象的析构。析构函数不需调用。

【提示】

样例1输入:

1 1 10 5

样例1输出:

1 1 10 5

(1,1,10,5)

26

36

*********

*********

*********

*********

(3,1,12,5)

26

36

*********

*********

*********

*********

(3,1,12,5)deconstruct

(3,1,12,5)deconstruct

(1,1,10,5)deconstruct

时间限制:500ms内存限制:32000kb


 




个人思路
一开始A的时候提示超时有点懵,后来我觉得多半是多次调用abs函数和循环里abs(x2-x1)或abs(y2-y1)的次数过多 所以导致超时,后面使用了abs函数(内联形式)和增加两个成员函数t1、t2就A过了。

下面代码
 

#include <iostream>
using namespace std;
inline int abs(int x){
	return x>0? x:-x;
}
class RECT
{
private:
	int x1,x2,y1,y2,t1,t2;
public:
	RECT():x1(0),x2(0),y1(0),y2(0)
	{ 	t1=abs(y2-y1);
		t2=abs(x2-x1);}
	RECT(int tx1,int ty1,int tx2,int ty2):x1(tx1),y1(ty1),x2(tx2),y2(ty2)
	{ 	t1=abs(y2-y1);
		t2=abs(x2-x1);}
	RECT(RECT &r){ //拷贝构造函数
		x1=r.x1;
		x2=r.x2;
		y1=r.y1;
		y2=r.y2;
		t1=abs(y2-y1);
		t2=abs(x2-x1);
	}
	void showinfo(){
	 cout<<'('<<x1<<','<<y1<<','<<x2<<','<<y2<<')';
	}
	void set(int x1,int y1,int x2,int y2){
		this->x1=x1;
		this->x2=x2;
		this->y1=y1;
		this->y2=y2;
		t1=abs(y2-y1);
		t2=abs(x2-x1);
	}
	int perimeter(){
		return 2*(t1+t2);
	}
	int area(){
		return t1*t2;
	}
	void show();
	~RECT(){
		cout<<'('<<x1<<','<<y1<<','<<x2<<','<<y2<<')'<<"deconstruct"<<endl;
	}
};
void RECT::show(){
	//t1=abs(y2-y1);
	//t2=abs(x2-x1);
	for(int i=0;i<t1;i++)
	{
		for(int j=0;j<t2;j++)
		{
			cout<<'*';
		}
		cout<<endl;
	}
}

int main()
{
	RECT a;
	double x1,y1,x2,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);
	RECT c(b);
	c.showinfo();cout<<endl;
	cout<<c.perimeter()<<endl;
	cout<<c.area()<<endl;
	c.show();
			
	return 0;
}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

重剑DS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值