返回信息流以下是来自一篇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; 传递的是对象的值?
这是一条镜像帖。来源:北邮人论坛 / cpp / #46254同步于 2010/11/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于c++引用机制的疑问
Nekid
2010/11/15镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
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; 传递的是对象的值?
后来研究了一下觉得Object& temp=o1;在创建对象引用时调用的是拷贝构造函数,只是简单复制指针,即浅拷贝
o2=temp是对已存在对象引用赋值,调用的是赋值函数,同类对象赋值即为变量值的赋值