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

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

报告相同问题?

悬赏问题

  • ¥60 pb数据库修改或者求完整pb库存系统,需为pb自带数据库
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上
  • ¥20 关于#anlogic#sdram#的问题,如何解决?(关键词-performance)
  • ¥15 相敏解调 matlab
  • ¥15 求lingo代码和思路