#include<iostream>
#include<cmath>
using namespace std;
class Rectangle
{
private:
double left,top;
double right,bottom;
public:
Rectangle (double l=0,double t=0,double r=0,double b=0);
Rectangle (Rectangle & t);
~Rectangle(){}
void Assign(double l,double t,double r,double b);//虽然这个assign函数和构造函数的功能看起来是一模一样的,但是在作用上面
void Show();//有着本质的区别,前面一个是在创建对象的最开始的时候被自动调用的,而assign这个函数是后来我们对他进行其他值的
double Area();//传入的时候来发挥作用的,性质和作用不一样,
double Perimeter();
};
Rectangle::Rectangle (Rectangle & t)
{
left=t.left;
top=t.top;
right=t.right;
bottom=t.bottom;
cout<<"has been used !"<<endl;
}
Rectangle::Rectangle (double l,double t,double r,double b)
{
left=l,top=t;
right=r,bottom=b;
}
void Rectangle::Assign(double l,double t,double r,double b)
{
left=l,top=t;
right=r,bottom=b;
}
void Rectangle::Show()
{
cout<<"left-top point is ("<<left<<","<<top<<")"<<'\n';
cout<<"right-bottom point is ("<<right<<","<<bottom<<")"<<'\n';
}
double Rectangle::Area()
{
return fabs((right-left)*(bottom-top));
}
double Rectangle::Perimeter()
{
return 2*(fabs(right-left)+fabs(bottom-top));
}
void fuckshow2(Rectangle t)//复制构造函数如果是按照rectangle & t的方式来进行引用传递的话,并不会调用构造函数,输出的是输入的
{ //以类为形参的相应结果,
//但是,即使不用引用来写,输出的结果还是输入的以类为形参的相应结果,所以就最终结果来看的话,结果还是相同的
//所以我们一般用的都是传递引用,这样会比传递值要快的多
t.Show();
cout<<endl;
}
Rectangle fuckshow3()
{
Rectangle shiyan(666,666,999,999);//这里会创建一个临时的对象,不过这个fuckshow3的函数执行完过后就会被销毁,这是生存期的问题,将shiyan的值
//复制到临时对象中,也就是复制构造函数的第一种情况
return shiyan;
}
int main()
{
//Rectangle rect;//有人说最上面的那个地方可以省去各种各样的形参值,不用这么来,用不用这么来的话,最关键的地方是看一个地方,那就是这里
//rect.Show();//根据构造函数的定义来看的话,在创建的时候就会被调用,将实参值作为初始值,而这里没有给初始值,构造里面也没有默认值,所以错了
//rect.Assign(100,200,300,400);//编译的时候就会报错,是语法错误
//rect.Show();
//cout<<"面积"<<rect.Area()<<'\t'<<"周长"<<rect.Perimeter()<<endl;
Rectangle rect1(0,0,200,200);
rect1.Show();
//rect1.Assign(100,200,300,400);
//rect1.Show();
cout<<"面积"<<rect1.Area()<<'\t'<<"周长"<<rect1.Perimeter()<<endl;
//Rectangle rect2=rect1;//复制构造函数第一种情况:用类的一个对象去初始化类的另外一个对象;
//Rectangle rect2(rect1)//和上面的那个复制构造函数的情况实际上是一样的,只是形式的差别而已;
//fuckshow2(rect);//复制构造函数第二种情况,当函数的形参是类的对象的时候,调用的时候形参和实参相结合;
//cout<<"面积"<<rect2.Area()<<'\t'<<"周长"<<rect2.Perimeter()<<endl;
Rectangle rect3;
rect3=fuckshow3();//这个是复制构造函数的第三种情况,返回值是类的对象,函数执行完成返回类的对象的时候;
rect3.Show();
return 0;
}