来自地球的外星人呀 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 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送
  • ¥15 SQLite 出现“Database is locked” 如何解决?