来自地球的外星人呀 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是比较常见的一种

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

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站