回 帖 发 新 帖 刷新版面

主题:类的组合,求助!!!

[size=3]#include <iostream>
#include <cmath>
using namespace std;
class Point
{
public:
    Point(int xx=0,int yy=0) {X=xx;Y=yy;}
    Point(Point&p);
    int GetX() {return X;}
    int GetY() {return Y;}
private:
    int X,Y;
};
Point::Point(Point &p)
{
    X=p.X;
    Y=p.Y;
    cout<<"Poin拷贝构造函数被调用"<<endl;
}
class Line
{
public:
    Line(Point xp1,Point xp2);
    Line(Line &L);
    double GetLen() {return len;}
private:
    Point p1,p2;
    double len;
};
Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2)
{
    cout<<"Line构造函数被调用"<<endl;
    double x=double(p1.GetX()-p2.GetX());
    double y=double(p1.GetY()-p2.GetY());
    len=sqrt(x*x+y*y);
}
Line::Line(Line &L):p1(L.p1),p2(L.p2)
{
    cout<<"Line拷贝构造函数被调用"<<endl;
    len=L.len;
}
void main()
{
    Point myp1(1,1),myp2(4,5);
    Line A(myp1,myp2);
    Line B(A);
    cout<<"The length of the line is:";
    cout<<A.GetLen()<<endl;
    cout<<"The length of the line2 is:";
    cout<<B.GetLen()<<endl;
}[/size]

[color=008000][size=3]运行结果是:
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Line构造函数被调用
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Line拷贝构造函数被调用
The length of the line is:5
The length of the line2 is:5[/size][/color]

[color=800000][size=2]学到“类的组合”这里,看着程序的运行结果,实在搞不懂这个程序中程序的调用函数的顺序,请大家帮我详细讲一下好吗?谢谢了!!![/size][/color]

回复列表 (共5个回复)

沙发

这句Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2)导致了前面的4句
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Point拷贝构造函数被调用
Point拷贝构造函数被调用
因为你是按值传递参数,C++ 有这种机制,如果参数是按值传递,那么在传递过程中,即把实参传进去的 时候,会调用参数的拷贝构造函数,这样就把实参的值拷给行参,完成参数传递,这句Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2)有四个point参数,都是按值传递的,完了后输出 Line构造函数被调用,接着执行到 Line B(A);
这里时,再调用Line的拷贝构造函数,这里,这句Line::Line(Line &L):p1(L.p1),p2(L.p2)
的p1(L.p1),p2(L.p2)部分调用了两次Point的拷贝构造函数,故输出两次,完成赋值后,输出 Line构造函数被调用 ,所以,整个执行过程就会输出这么多

板凳


[size=3]"这句Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2)有四个point参数"
请问,这四个point参数是哪四个啊?[/size]

3 楼

4个参数,自然就是Line里的xp1,xp2,还有默认构造方法里的xp1和xp2了

4 楼

Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2),里的Point xp1,Point xp2两个,然后xp1,xp2,又作为实参传递给,p1(xp1),p2(xp2),又两个

5 楼

谢谢大家的帮忙!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册