关于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的首地址)。
具体分析过程,见代码注释。
点击(此处)折叠或打开
- //C++源码。
- //VC6.0
- #include<iostream>
- #include<cstdio>
- using namespace std;
- class CBase{
- int i;
- public:
- CBase(int i=0)
- {
- this->i=i;
- }
- CBase(CBase& rhs)//拷贝构造函数。
- {
- i=rhs.i;
- printf("拷贝构造函数=%d\n",i);
- }
- void show(CBase B1, CBase B2)//对象作为形参。
- {
- printf("show=%d,%d\n",B1.i,B2.i);
- }
- };
- int main()
- {
- CBase Base;
- CBase Basex(1);
- CBase Basexx(2);
- Base.show(Basex,Basexx);
- // printf("this is an end!\n");
- }