c++怎么把对象作为python 函数 对象参数参数?

C++愤恨者札记1——类对象作为函数参数的数据传递过程
C++愤恨者札记1&&类对象作为函数参数的数据传递过程
&&& C++繁杂的机制,加上枯燥的教科书,再加上无法回避地要使用它,注定要造就一批C++愤恨者。本文作为C++愤恨者札记系列第一篇,从汇编角度,观察类对象作为函数参数时的数据传递过程。
&&& 若没有特殊说明,编译器使用的是VC++,反汇编使用的是Windbg.下面是它们的版本号:
&&& Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
&&& Microsoft (R) Windows Debugger Version 6.11.
测试代码如下:
class Node&
&&& Node(){}&
&&& //Node(Node& n);&
&&& int data1;&
&&& int data2;&
&&& int data3;&
&&& int data4;&
&&& int data5;&
&&& int data6;&
&&& int data7;&
//Node::Node(Node &n)&
void Fn( int a, Node n, int& b )&
&&& n.data1 = 100;&
&&& n.data2 = 100;&
&&& a = 100;&
&&& b = 10;&
void main()&
&&& Fn(1, n, 2);&
--------------------------------------------------
未使用拷贝构造函数时,调用Fn的反汇编代码:
00fa&&&&&&&&&&& push&&& 2&&&&& ;第三个参数入栈&
00fac&&&&&&&&& sub&&&& esp,1Ch&&& ;为Node n分配栈内存, 注意,构造函数Node(),并没调用&
00fa000&&&&& mov&&&& ecx,7&&&&& ;rep循环次数&
00fa142b 8d75e0&&&&&&&&& lea&&&& esi,[ebp-20h]& ;Node n地址&
00fa142e 8bfc&&&&&&&&&&& mov&&&& edi,esp&&& ;栈空间地址&
00fa&&&&&&&&&&& rep movs dword ptr es:[edi],dword ptr [esi]&&& ;把n内容拷贝到栈空间上&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;A5 MOVS m32, m32 Move doubleword&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ;at address DS:(E)SI to address ES:(E)DI&
00fa&&&&&&&&&&& push&&& 1&&&&& ;第一个参数入栈&
00fafdffff&&&&& call&&& hello!ILT+470(?FnYAXHVNodeHZ) (00fa11db)&
00fa&&&&&&&&& add&&&& esp,24h&&& ;恢复栈平衡,4+1CH+4=24H&
类对象参数位于栈上,是通过sub esp size来分配的。数据是通过内存拷贝来初始化。
--------------------------------------------------
使用拷贝构造函数时,即上面代码把注释去掉,调用Fn的反汇编代码:
a02&&&&&&&&&&& push&&& 2&&&&& ;第三个参数入栈&
ec1c&&&&&&&&& sub&&&& esp,1Ch&&& ;开辟栈空间&
bcc&&&&&&&&&&& mov&&&& ecx,esp&&& ;栈内存首址保存在ecx中,拷贝构造函数的this指针&
d45e0&&&&&&&&& lea&&&& eax,[ebp-20h]& ;实参地址&
&&&&&&&&&&&&& push&&& eax&&&&&&& ;作为拷贝构造函数的参数&
d4edffff&&&&& call&&& hello!ILT+485(??0NodeQAEAAV0Z) (010011ea)& ;拷贝构造函数,替换了rep movs内存拷贝&
a01&&&&&&&&&&& push&&& 1&&&&& ;第一个参数入栈&
beedffff&&&&& call&&& hello!ILT+470(?FnYAXHVNodeHZ) (010011db)&
c424&&&&&&&&& add&&&& esp,24h&&& ;恢复栈平衡&
类参数仍然位于栈上,也是通过sub esp size来分配的。数据是通过拷贝构造函数初始化的,C++的机制就是繁多--||。
--------------------------------------------------
下面是Fn的反汇编结果,它可不管Node n是怎么初始化的,只要把它在栈上的位置找到就OK啦。
hello!Fn:&
00a41a60 55&&&&&&&&&&&&& push&&& ebp&&&&&&&&&&&&&&&&&&&&&&&& | old ebp&&&& |& ebp&
00a41a61 8bec&&&&&&&&&&& mov&&&& ebp,esp&&&&&&&&&&&&&&&&&&&& |-------------|&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& | ret address |& ebp+4&
00a41a63 81ecc0000000&&& sub&&&& esp,0C0h&&&&&&&&&&&&&&&&&&& |-------------|&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& | int a&&&&&& |& ebp+8&
00a41a69 53&&&&&&&&&&&&& push&&& ebx&&&&&&&&&&&&&&&&&&&&&&&& |-------------|&
00a41a6a 56&&&&&&&&&&&&& push&&& esi&&&&&&&&&&&&&&&&&&&&&&&& | Node n&&&&& |& ebp+0CH&
00a41a6b 57&&&&&&&&&&&&& push&&& edi&&&&&&&&&&&&&&&&&&&&&&&& |-------------|&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& | int b&&&&&& |& ebp+28H&
00a41a6c 8dbd40ffffff&&& lea&&&& edi,[ebp-0C0h]&
00a41a72 b&&&&& mov&&&& ecx,30h&
00a41a77 b8cccccccc&&&&& mov&&&& eax,0CCCCCCCCh&
00a41a7c f3ab&&&&&&&&&&& rep stos dword ptr es:[edi]&&& ;以是为局部变量空间初始化,debug版特有的&
00a41a7e c0& mov&&&& dword ptr [ebp+0Ch],64h&&& ;n.data1 = 100; 显示ebp+0Ch是参数n的起始地址&
00a41a85 c0& mov&&&& dword ptr [ebp+10h],64h&&& ;n.data2 = 100;&
00a41a8c c0& mov&&&& dword ptr [ebp+8],64h&&&&& ;a = 100;&
00a41a93 c000& mov&&&& dword ptr [ebp+28h],0Ah&&& ;b = 10;&
00a41a9a 5f&&&&&&&&&&&&& pop&&&& edi&
00a41a9b 5e&&&&&&&&&&&&& pop&&&& esi&
00a41a9c 5b&&&&&&&&&&&&& pop&&&& ebx&
00a41a9d 8be5&&&&&&&&&&& mov&&&& esp,ebp&
00a41a9f 5d&&&&&&&&&&&&& pop&&&& ebp&
00a41aa0 c3&&&&&&&&&&&&& ret&
--------------------------------------------------
&&& 类对象做为函数参数时,是被存放在栈上的,不影响实参的数据。
&&& 若未重写拷贝构造函数,类的其它构造函数将不会被调用。形参的数据是通过内存拷贝传递的。若重写了,拷贝构造函数将会在初始化形参时被调用,不再进行内存拷贝工作。
作者:tms_li如何把object对象作为参数代入js函数中呢?
[问题点数:40分]
本版专家分:0
结帖率 95.16%
CSDN今日推荐
本版专家分:21353
2013年4月 Web 开发大版内专家分月排行榜第二
2017年12月 Web 开发大版内专家分月排行榜第三2013年3月 Web 开发大版内专家分月排行榜第三
本版专家分:0
结帖率 95.16%
本版专家分:395997
2017年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第五
2018年5月 总版技术专家分月排行榜第一2018年4月 总版技术专家分月排行榜第一2018年2月 总版技术专家分月排行榜第一2017年8月 总版技术专家分月排行榜第一
2018年3月 总版技术专家分月排行榜第二2017年11月 总版技术专家分月排行榜第二2016年2月 总版技术专家分月排行榜第二2014年2月 总版技术专家分月排行榜第二2013年4月 总版技术专家分月排行榜第二
匿名用户不能发表回复!|
CSDN今日推荐如何把c++的定义的类对象做为参数传递。谢谢
[问题点数:100分,结帖人a7896883]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:119324
2008年 总版技术专家分年内排行榜第七
2008年1月 总版技术专家分月排行榜第三
2008年1月 VC/MFC大版内专家分月排行榜第一2007年12月 VC/MFC大版内专家分月排行榜第一
2008年9月 VC/MFC大版内专家分月排行榜第二2008年6月 VC/MFC大版内专家分月排行榜第二2008年5月 VC/MFC大版内专家分月排行榜第二2008年3月 VC/MFC大版内专家分月排行榜第二2008年2月 VC/MFC大版内专家分月排行榜第二
本版专家分:29145
2009年3月 C/C++大版内专家分月排行榜第二
本版专家分:0
结帖率 100%
本版专家分:0
结帖率 100%
本版专家分:0
结帖率 100%
本版专家分:142
本版专家分:30
本版专家分:6634
本版专家分:0
结帖率 100%
本版专家分:14159
本版专家分:0
结帖率 100%
本版专家分:0
结帖率 100%
本版专家分:14159
本版专家分:14159
本版专家分:1604
本版专家分:3750
本版专家分:5392
本版专家分:0
结帖率 100%
本版专家分:0
结帖率 100%
本版专家分:40
匿名用户不能发表回复!|
CSDN今日推荐求助:怎么将一个类对象数组传递到一个函数里面当参数?【c++吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:304,087贴子:
求助:怎么将一个类对象数组传递到一个函数里面当参数?收藏
void Admin::create(string name,int age,Student arr“[]”){}这是我写的一个函数,Student是一个类,我在main里面定义了一个类对象数组,但在写函数时想传递一个类对象数组,如上图,加了[]就报错,不知道怎么实现??
c++,博为峰软件培训免费试听,0元入学,签署就业保障协议,不就业不收费!博为峰,真正的为年轻人服务的企业,14年间培训15万余名软件工程师,成绩斐然!
形参用引用
使用指针,然后再加上一个长度参数
删去“”吧 用(&art)[ ]
Student (&arr)[N]或者传指针 Student *arr 。
这一记洛阳铲
登录百度帐号当前位置:
&C++怎么调用类的成员函数时,怎么将数组作为参数传递进去?
C++怎么调用类的成员函数时,怎么将数组作为参数传递进去?
最近有个C++问题,希望大家帮我解惑
程序如下:
class Insert
static double f(const double x[],const double y[],const double t)
........//该部分代码省略
x[]={1,2,3,4,5,6,7,8,9};
y[]={12,23,14,23,35,45,64,25,56};
das.f(x[],y[],6.5);//A
编译的时候A行会报错,提示&]&有问题,怎么也搞不懂,现在想问一下采用怎样的方法,调用类的成员函数时,能将外部的数组作为参数全部传进去。
我要是将A行改成:das.f(x,y,6.5);则编译没有问题,但是只能讲这两个数组的第一个数传进去,希望将数组的全部元素都传进去,有点纠结,希望大家帮个忙,谢谢!
传地址或者指针
引用回帖:: Originally posted by wshy1126 at
传地址或者指针 能麻烦在程序上该一下吗,
传参换成数组指针试下,(*x)
你在main函数中以das.f(x,y,6.5)调用函数,只是把x数组和y数组的首地址传过去了,如需知道数组长度,还得在main函数中利用sizeof(x)/sizeof(double)求出,当参数传给f函数。
24小时热帖
下载小木虫APP
与700万科研达人随时交流

我要回帖

更多关于 python 函数 对象参数 的文章

 

随机推荐