引用可以说是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);//调用端后两种写法一样,更好理解,用引用也更快;
操作场景 本节操作介绍在Windows和Linux环境中使用SSH密钥对方式远程登录Linux云...
每年618是年中购物节,每到这一天,大家都会进入网购模式,疯狂的买买买。618购...
1. 接口描述 接口请求域名: cvm.tencentcloudapi.com 。 本接口 (ResetInstance...
Cloud-init是开源的云初始化程序,能够对新创建弹性云服务器中指定的自定义信息...
本文转载自公众号读芯术(ID:AI_Discovery) 下面这个模型在一项图像识别竞赛中经...
云计算服务正在以前所未有的速度在各行各业快速普及,成为IT应用的最主流实现形...
据IDC评述网(idcps.com)报道,ntldstats.com最新数据显示,截止至2016年3月31...
步入2月,美股新一轮财报季渐入高潮。 本周二,包括阿里巴巴、亚马逊、谷歌在内...
【编者的话】本文作者利用自己云原生工程师的优势,分享了他对2021年及之后的云...
TOP云 (west.cn)8月14日消息,本期的sedo 域名交易 榜共有63个 域名 超2000美...