| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1702 人关注过本帖
标题:C++新手求助,为什么这个复制构造函数只调用了两次?
只看楼主 加入收藏
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
C++新手求助,为什么这个复制构造函数只调用了两次?
你好,谢谢你点进来。
图片附件: 游客没有浏览图片的权限,请 登录注册

在这个函数中我似乎调用了两次getx()和两次gety()
getx(),gety()函数如下
图片附件: 游客没有浏览图片的权限,请 登录注册

返回值为类对象时,复制构造函数就会被调用,但运行结果中好像只出现了两次复制构造函数
图片附件: 游客没有浏览图片的权限,请 登录注册

请问这是为什么
搜索更多相关主题的帖子: 构造函数 复制 调用 函数 C++ 
2020-03-21 22:45
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
收藏
得分:0 
对不起,上面结果图中圈错了。
下面是正确的图
图片附件: 游客没有浏览图片的权限,请 登录注册
2020-03-21 22:55
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
收藏
得分:0 
对不起,上面结果图中圈错了。
下面是正确的图
图片附件: 游客没有浏览图片的权限,请 登录注册
2020-03-21 22:55
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
一头雾水,我根本看不懂你分析的内容。
Point拷贝构造两次 难道不是因为 值传递给 Line构造函数,你改为正常人的const Point&就行了
2020-03-22 09:40
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
收藏
得分:0 
回复 4楼 rjsp
但是值传给Line构造函数时调用拷贝构造函数输出的是第一行和第二行呀,那么第三第四行难道不是因为调用了getx()和gety()才输出的吗
2020-03-22 13:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用编程小白DIO在2020-3-22 13:38:28的发言:

但是值传给Line构造函数时调用拷贝构造函数输出的是第一行和第二行呀,那么第三第四行难道不是因为调用了getx()和gety()才输出的吗
给出代码吧,否则空对空,全在瞎扯
2020-03-22 14:10
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
你想说的是不是
Line::Line( Point xp1, Point xp2 ) : p1(xp1), p2(xp2)
正好四次?

BTW: 下次别贴图了,没有人想再照着图片打一遍代码
2020-03-22 14:17
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
收藏
得分:0 
回复 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()两次,于是应该输出四次,但是结果只有两次。
2020-03-22 14:29
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
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 为什么要调用拷贝构造?


2020-03-22 14:58
编程小白DIO
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2020-3-14
收藏
得分:0 
回复 9楼 rjsp
原来是这样!
因为之前在网上查到复制构造函数被调用的三种情况,结果自己理解错了
谢谢你的解答!!
2020-03-22 15:19
快速回复:C++新手求助,为什么这个复制构造函数只调用了两次?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014601 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved