引用可以说是c++一大特色,好用但是好多人都搞不明白它,现在我尝试着用我这几天跟着侯捷老师学来的写一下我的理解。
int a = 4 | |
int& s = a | |
int* p = &a(指向第一行的a) | |
int a1 = 5; | |
int& s2 = s; | |
memory
int a = 4; //可以得到内存里开辟了一个空间存放a(4个字节)
int* p = &a; //取a的地址赋值给p,从而p是一个指向a的一个地址(对于32位pc来说也是四字节)
int& s = a; //p是a的引用,也可以说是p代表a并且之后p只能代表a,不会改变,从而p, a 都是4
//(从memory看,好像引用并没有指向a,实际上在引用内部是存在指向a的指针的).
int a1 = 5;
s = a1; //s是不能重新代表其他物体的,因而,s还是代表a,s变成了5因此a也变成了5。(函数传参常用)
int& s2 = s; //现在是s2代表s,s代表a,也可以说是s2代表a;
下面给大家一个例子(摘抄自侯捷老师的视频)
typedef struct Stag{int a, b, c, d;} S;
int main()
{
double x = 0;
double* p = &x;
double& s = x;
cout << sizeof(x) << endl; //输出8,double是八个字节
cout << sizeof(p) << endl; //输出4,是个地址
cout << sizeof(s) << endl; //输出8,因为引用是s代表x
cout << p << endl; //0065FDFC
cout << *p << endl; //0
cout << x << endl; //0
cout << s << endl; //0
cout << &s << endl; //0065FDFC
cout << &x << endl; //0065FDFC
S s;
S& rs = s;
cout << sizeof(s) << endl; //16个字节,4个int,4*4
cout << sizeof(rs) << endl; //16;
cout << &s << endl; //0065FDE8
cout << &rs << endl; //0065FDE8
}
//可以看到,我们看到的object与它的引用大小一样,地址也一样,然后通过上面的memory发现,并不是这样;这是因为;
//object与它的引用大小一样,地址也一样是假象,,我的理解:假象的意思是,,在内存里面不一样,,
//但是输出的时候经编译器的处理和内部存在,就是一样的,,,
//这个输出也说明了一件事引用确实代表着原对象,,,地址一样,值也一样不就是代表吗。。
日常写函数,,建议使用引用传参:
void fun1(Cls* pobj){return pobj->xxxx();}
void fun2(Cls& pobj){return pobj.xxxx();}
void fun3(Cls pobj){return pobj.xxxx();}//被调用端后两种写法一样,更好理解,用引用也更快
Cls obj;
fun1(&obj);
fun2(obj);
fun3(obj);//调用端后两种写法一样,更好理解,用引用也更快;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。