C++高手请进

2025-03-12 10:04:02
推荐回答(2个)
回答1:

第一题
int gcd(int m,int n)//返还m和n的最大公约数
{
if(m swap(m,n);//库函数swap()用来交换m和n的值
while (n>0)
{
int r=m%n;
m=n;
n=r;
}
return m;
}

class Ratio
{
public:
Ratio (int n=0,int d=1):num(n),den(d)
{
cout <<"普通构造函数被调用!\n";
reduce();
}
Ratio(Ratio&r):num(r.num),den(r.den)//拷贝构造函数
{
cout<<"拷贝构造函数被调用!\n";
}
friend Ratio func(Ratio &r);
void disp()//输出有理数
{
cout< }
private :
int num,den;
void reduce();
};

void Ratio::reduce()//对有理数进行简化或规则化
{
if (num==0 || den==0)
{
num=0 ;
den=0;
return;
}
if (den<0)
{
den*=-1;
num*=-1;
}
if (den==1)
return;
int sgn=(num<0?-1:1);
int g=gcd(sgn*num,den);
num/=g;
den/=g;//对分数进行约分
}

Ratio func(Ratio &r)
{
Ratio&s = r;
cout<<"fun()含函数被调用!\n";
s.den=6;
cout<<"s现在存在,s是:";s.disp();
return s;
}

int main()
{
Ratio x(20,7);
cout<<"x现在存在,x是:";
x.disp();

Ratio y(x);
cout<<"y现在存在,y是:";
y.disp();
cout<<"func()函数开始:"<
func(x);
cout<<"func()函数结束."<
Ratio z(x);
cout<<"z现在存在,z是:";
z.disp();

return 0;
}

第二题
class Point//定义point类
{
public:
Point(double nx=0.0,double ny=0.0):x(nx),y(ny){}
Point(Point&np):x(np.x),y(np.y){}
double GetX(){return x;}
double GetY(){return y;}
void SetX(double nx){x=nx;}
void SetY(double ny){x=ny;}
void SetPoint(double nx,double ny){x=nx;y=ny;}
void SetPoint(Point &np){x=np.x;y=np.y;}
private:
double x ,y;
};

class Triangle
{
public:
Triangle(Point pa,Point pb,Point pc):p1(pa),p2(pb),p3(pc){}
Triangle(Triangle& RTriangle):p1(RTriangle.p1),p2(RTriangle.p2),p3(RTriangle.p3){}
double getperimeter() //计算三角形面积
{
//√{1/4[c^2a^2-((c^2+a^2-b^2)/2)^2]}
double a2 = pow(abs(p1.GetX()-p2.GetX()),2)+pow(abs(p1.GetY()-p2.GetY()),2);//边长 a 的平方
double b2 = pow(abs(p2.GetX()-p3.GetX()),2)+pow(abs(p2.GetY()-p3.GetY()),2);//边长 b 的平方
double c2 = pow(abs(p1.GetX()-p3.GetX()),2)+pow(abs(p1.GetY()-p3.GetY()),2);//边长 c 的平方
double re = 1/4.0*(a2*c2 - pow((c2+a2-b2)/2,2));
return pow(re,0.5);
}
private:
Point p1,p2,p3;
};

void main(){
Point p1(2,3),p2(30,60),p3(20,50);
Triangle t1(p1,p2,p3);
cout<}

回答2:

1.《形参》
说明在参数传入的过程中创建了临时对象,而如果形参是引用类型,则不对再对参数创建拷贝。
《定义初始化》
定义对象时候,如果采用其他对象赋值的形式,实际上对调用拷贝构造函数(如果没有重载=),如果定义为引用类型,则不会再调用拷贝构造函数。
《返回值》
如果返回值为该对象类型,函数也将为返回值创建临时对象,而当返回值为引用类型时候,不会为返回值创建临时对象

总结,当一个对象在传参,构造以及返回的时候,都可能会产生副本,为了避免这种情况,我们可以采用引用类型来避免创建临时变量

#include
using namespace std;

class Point//定义point类
{
public:
Point(double nx=0.0,double ny=0.0):x(nx),y(ny){}
Point(Point&np):x(np.x),y(np.y){}
double GetX(){return x;}
double GetY(){return y;}
void SetX(double nx){x=nx;}
void SetY(double ny){x=ny;}
void SetPoint(double nx,double ny){x=nx;y=ny;}
void SetPoint(Point &np){x=np.x;y=np.y;}
private:
double x ,y;
};

class Triangle:public Point
{
public:
Triangle(double x1,double y1,double x2,double y2,double x3,double y3)
:p1(x1,y1),p2(x2,y2),p3(x3,y3)
{}
double getperimeter()
{
//返回3个变长的和就行了。
//变长有距离公式,(x-x2)方+ (y-y2)方,开根号
return 0;
}
private:
Point p1,p2,p3;
};

int main()
{
Triangle t(1,1, 3,1, 2,2);

return 0;
}