注册 登录
编程论坛 C++教室

C++新手求助,为什么这个复制构造函数只调用了两次?

编程小白DIO 发布于 2020-03-21 22:45, 1846 次点击
你好,谢谢你点进来。
只有本站会员才能查看附件,请 登录

在这个函数中我似乎调用了两次getx()和两次gety()
getx(),gety()函数如下
只有本站会员才能查看附件,请 登录

返回值为类对象时,复制构造函数就会被调用,但运行结果中好像只出现了两次复制构造函数
只有本站会员才能查看附件,请 登录

请问这是为什么
9 回复
#2
编程小白DIO2020-03-21 22:55
对不起,上面结果图中圈错了。
下面是正确的图
只有本站会员才能查看附件,请 登录
#3
编程小白DIO2020-03-21 22:55
对不起,上面结果图中圈错了。
下面是正确的图
只有本站会员才能查看附件,请 登录
#4
rjsp2020-03-22 09:40
一头雾水,我根本看不懂你分析的内容。
Point拷贝构造两次 难道不是因为 值传递给 Line构造函数,你改为正常人的const Point&就行了
#5
编程小白DIO2020-03-22 13:38
回复 4楼 rjsp
但是值传给Line构造函数时调用拷贝构造函数输出的是第一行和第二行呀,那么第三第四行难道不是因为调用了getx()和gety()才输出的吗
#6
rjsp2020-03-22 14:10
以下是引用编程小白DIO在2020-3-22 13:38:28的发言:

但是值传给Line构造函数时调用拷贝构造函数输出的是第一行和第二行呀,那么第三第四行难道不是因为调用了getx()和gety()才输出的吗
给出代码吧,否则空对空,全在瞎扯
#7
rjsp2020-03-22 14:17
你想说的是不是
Line::Line( Point xp1, Point xp2 ) : p1(xp1), p2(xp2)
正好四次?

BTW: 下次别贴图了,没有人想再照着图片打一遍代码
#8
编程小白DIO2020-03-22 14:29
回复 7楼 rjsp
抱歉,这个是代码。

#include <iostream>
#include <cmath>
using namespace std;
class Point {    //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 << "调用复制构造函数Point" << endl;
}

//类的组合
class Line {    //Line类的定义
public:    //外部接口
    Line(Point xp1, Point xp2);
    Line(Line& l);
    double getLen() { return len; }
private:    //私有数据成员
    Point p1, p2;    //Point类的对象p1,p2
    double len;
};


//组合类的构造函数
Line::Line(Point xp1, Point xp2) : p1(xp1), p2(xp2)
{
    cout << "调用构造函数Line" << endl;
    double x = static_cast<double>(p1.getX() - p2.getX());

    double y = static_cast<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;
}

//主函数
int main() {
    Point myp1(1, 1), myp2(4, 5);    //建立Point类的对象
    Line line(myp1, myp2);    //建立Line类的对象
    Line line2(line);    //利用复制构造函数建立一个新对象
    cout << "The length of the line is: ";
    cout << line.getLen() << endl;
    cout << "The length of the line2 is: ";
    cout << line2.getLen() << endl;
    return 0;
}

我想的是
//组合类的构造函数
Line::Line(Point xp1, Point xp2) : p1(xp1), p2(xp2)
{
    cout << "调用构造函数Line" << endl;
    double x = static_cast<double>(p1.getX() - p2.getX());

    double y = static_cast<double>(p1.getY() - p2.getY());
    len = sqrt(x * x + y * y);
}
这个函数里面出现了getX()两次,getY()两次,于是应该输出四次,但是结果只有两次。
#9
rjsp2020-03-22 14:58
Line line(myp1, myp2);
myp1 传给 Line::Line(Point xp1, Point xp2) 中的 xp1,一次
myp2 传给 Line::Line(Point xp1, Point xp2) 中的 xp2,一次
Line::Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) 中 xp1 传给 p1,一次
Line::Line(Point xp1, Point xp2) : p1(xp1), p2(xp2) 中 xp2 传给 p2,一次
这不正好四次吗?

这个函数里面出现了getX()两次,getY()两次,于是应该输出四次,但是结果只有两次。
??? 调用 getX 为什么要调用拷贝构造?


#10
编程小白DIO2020-03-22 15:19
回复 9楼 rjsp
原来是这样!
因为之前在网上查到复制构造函数被调用的三种情况,结果自己理解错了
谢谢你的解答!!
1