BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #46254同步于 2010/11/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于c++引用机制的疑问

Nekid
2010/11/15镜像同步2 回复
以下是来自一篇blog中的一个例子 #include <iostream> using namespace std; class Object { public: Object(int value1, int value2):a(value1), b(value2) {} int a; int b; }; int main() { Object o1(1,2); Object o2(3,4); cout<<o1.a<<" "<<o1.b<<" "<<o2.a<<" "<<o2.b<<endl; function(o1, o2); cout<<o1.a<<" "<<o1.b<<" "<<o2.a<<" "<<o2.b<<endl; return 0; } void function (Object& o1, Object& o2) { Object temp=o1; o1=o2; o2=temp; } #include <iostream> using namespace std; class Object { public: Object(int value1, int value2):a(value1), b(value2) {} int a; int b; }; int main() { Object o1(1,2); Object o2(3,4); cout<<o1.a<<" "<<o1.b<<" "<<o2.a<<" "<<o2.b<<endl; function(o1, o2); cout<<o1.a<<" "<<o1.b<<" "<<o2.a<<" "<<o2.b<<endl; return 0; } void function (Object& o1, Object& o2) { Object temp=o1; o1=o2; o2=temp; } 输出结果是 3 4 1 2 将函数function做如下修改 C++代码 void function (Object& o1, Object& o2) { Object& temp=o1; o1=o2; o2=temp; } void function (Object& o1, Object& o2) { Object& temp=o1; o1=o2; o2=temp; } 结果是: 3 4 3 4 以下是部分汇编代码 void function (Object& o1, Object& o2) { 00411770 push ebp 00411771 mov ebp,esp 00411773 sub esp,0CCh 00411779 push ebx 0041177A push esi 0041177B push edi 0041177C lea edi,[ebp-0CCh] 00411782 mov ecx,33h 00411787 mov eax,0CCCCCCCCh 0041178C rep stos dword ptr es:[edi] Object& temp=o1; 0041178E mov eax,dword ptr [o1] 00411791 mov dword ptr [temp],eax o1=o2; 00411794 mov eax,dword ptr [o2] 00411797 mov ecx,dword ptr [eax] 00411799 mov edx,dword ptr [eax+4] 0041179C mov eax,dword ptr [o1] 0041179F mov dword ptr [eax],ecx 004117A1 mov dword ptr [eax+4],edx o2=temp; 004117A4 mov eax,dword ptr [temp] 004117A7 mov ecx,dword ptr [eax] 004117A9 mov edx,dword ptr [eax+4] 004117AC mov eax,dword ptr [o2] 004117AF mov dword ptr [eax],ecx 004117B1 mov dword ptr [eax+4],edx } 对引用的理解是 引用值(指针)->对象名(指针)->对象内存空间 我的疑问在于,在汇编代码中 Object& temp=o1; 0041178E mov eax,dword ptr [o1] 00411791 mov dword ptr [temp],eax o2=temp; 004117A4 mov eax,dword ptr [temp] 004117A7 mov ecx,dword ptr [eax] 004117A9 mov edx,dword ptr [eax+4] 004117AC mov eax,dword ptr [o2] 004117AF mov dword ptr [eax],ecx 004117B1 mov dword ptr [eax+4],edx 这两部分同样是引用传值为什么 Object& temp=o1; 传递所指的是对象指针 而o2=temp; 传递的是对象的值?
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
guo机器人#1 · 2010/11/15
Object& temp=o1;和o2=temp;中的“=”含义不同 Object& temp=o1;是声明一个Object引用temp并初始化为o1 所以直接把pointer o1 mov给pointer temp即可 可以认为两者指向同一段内存 o2=temp;中的“=”会去调用Object类的隐式operator=方法 隐式的operator=就是直接“复制”成员变量 所以会把pointer temp指向的8字节分别放入ecx和edx 再分别mov到pointer o2所指向的内存,完成所谓的“复制” 个人看法~ 【 在 Nekid 的大作中提到: 】 : 我的疑问在于,在汇编代码中 : Object& temp=o1; : 0041178E mov eax,dword ptr [o1] : 00411791 mov dword ptr [temp],eax : o2=temp; : 004117A4 mov eax,dword ptr [temp] : 004117A7 mov ecx,dword ptr [eax] : 004117A9 mov edx,dword ptr [eax+4] : 004117AC mov eax,dword ptr [o2] : 004117AF mov dword ptr [eax],ecx : 004117B1 mov dword ptr [eax+4],edx : 这两部分同样是引用传值为什么 : Object& temp=o1; 传递所指的是对象指针 : 而o2=temp; 传递的是对象的值?
Nekid机器人#2 · 2010/11/15
后来研究了一下觉得Object& temp=o1;在创建对象引用时调用的是拷贝构造函数,只是简单复制指针,即浅拷贝 o2=temp是对已存在对象引用赋值,调用的是赋值函数,同类对象赋值即为变量值的赋值