来自地球的外星人呀 2017-10-27 15:35 采纳率: 100%
浏览 1000
已采纳

C++拷贝构造函数按传值方式的调用顺序?

#include
#include
using namespace std;
class Point
{
public:
Point(int X,int Y)
{x=X;y=Y;cout<<"Point带参构造函数调用完毕!"<<x<<ends<<y<<endl;}
~Point(){cout<<"Point析构函数调用完毕!"<<x<<ends<<y<<endl;}
Point(Point &P){x=P.x;y=P.y;cout<<"Point拷贝构造函数调用完毕!"<<x<<ends<<y<<endl;}
int getX(){return x;}
int getY(){return y;}
private:
int x,y;
};

class Line
{
private:
Point p1,p2;
double dist;
public:
Line(Point P1,Point P2);
Line(Line &L);
~Line(){cout<<"Line析构函数白调用!"<<endl;}
double getDist(){return dist;}
};
Line::Line(Point P1,Point P2):p1(P1),p2(P2)//传值方式,会建立副本。
{
cout<<"Line构造函数调用完毕!"<<endl;
double dx=double(p1.getX()-p2.getX());
double dy=double(p1.getY()-p2.getY());
dist=sqrt(dx*dx+dy*dy);
}
Line::Line(Line &L):p1(L.p1),p2(L.p2)
{ cout<<"Line拷贝构造函数调用完毕!"<<endl;dist=L.dist;}

int main()
{
Point myp1(1,2),myp2(4,5);
Line myL(myp1,myp2);
// cout<<"the distance is:"<<myL.getDist()<<endl;
// Line youL(myL);
// cout<<"the diatance is"<<youL.getDist()<<endl;
return 0;
}

请问红框里面四行顺序为什么是这样的?![图片说明

  • 写回答

1条回答 默认 最新

  • _观众 2017-10-28 02:11
    关注

    首先知道,C/C++默认的函数调用约定是cdecl,这个调用约定规定参数必须由右往左开始压栈(push),这就是为什么拷贝构造函数先45后12的原因,不知道你的问题是不是这里。这里函数调用约定规定函数的本身是不用清理堆栈,清理堆栈的任务交由调用者
    相关的还有其他的函数调用约定,stdcall和cedcl是比较常见的一种

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 eclipse mqtt 消息消费问题
  • ¥15 vue2(标签-chrome|关键词-浏览器兼容)
  • ¥15 python网络流自动生成系统 医学领域
  • ¥15 sql查询仓库里都有什么
  • ¥15 代码的修改,添加和运行完善
  • ¥15 krpano-场景分组和自定义地图分组
  • ¥15 lammps Gpu加速出错
  • ¥15 关于PLUS模型中kapaa值的问题
  • ¥15 关于博途V17进行仿真时无法建立连接问题
  • ¥15 机器学习教材中的例题询问