C++对象作为函数参数

本文详细分析了C++中对象作为函数参数时的传递过程,包括在栈上分配内存、调用拷贝构造函数以及栈帧结构。通过反汇编代码,展示了如何将对象的首地址压栈,并调用拷贝构造函数来复制数据成员。实例如`Base.show(Basex, Basexx)`调用中,可以看到拷贝构造函数被用来创建函数内部的局部对象副本。" 117661851,10072976,京东技术面试:三面经验分享+HR环节解析,"['分布式', '数据库', 'java', '面试']
摘要由CSDN通过智能技术生成

关于C/C++中基本类型(如:int,int*等)作为函数参数时,是通过将该变量的值压栈来进行参数传递;本文通过C++反汇编代码分析了当对象作为函数参数时(该形参非引用或指针),参数如何传递以及此时栈帧的结构。
      对象作为函数参数时,参数传递过程(如:函数的声明为:void show(class Object obj);该函数的调用的为show(arg);其中实参arg的类型为class Object):1,在栈顶上为obj对象分配内存空间,然后将对象arg的首地址压栈;2,调用拷贝构造函数(此为C++中三种调用拷贝构造函数情况之一),将arg的数据成员拷贝至obj;3,执行show()函数体(此时,ebp+8即为obj的首地址)。
      具体分析过程,见代码注释。

点击(此处)折叠或打开

  1. //C++源码。
  2. //VC6.0

  3. #include<iostream>
  4. #include<cstdio>
  5. using namespace std;

  6. class CBase{
  7.  int i;
  8. public:
  9.  CBase(int i=0)
  10.  {
  11.   this->i=i;
  12.  }
  13.  CBase(CBase& rhs)//拷贝构造函数。
  14.  {
  15.   i=rhs.i;
  16.   printf("拷贝构造函数=%d\n",i);
  17.  }
  18.  void show(CBase B1, CBase B2)//对象作为形参。
  19.  {
  20.   printf("show=%d,%d\n",B1.i,B2.i);
  21.  }
  22. };
  23. int main()
  24. {
  25.  CBase Base;
  26.  CBase Basex(1);
  27.  CBase Basexx(2);

  28.  Base.show(Basex,Basexx);
  29. // printf("this is an end!\n");
  30. }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值