当前位置:主页 > 查看内容

C++学习笔记-引用

发布时间:2021-05-03 00:00| 位朋友查看

简介:一、引用 引用可以说是c++一大特色,好用但是好多人都搞不明白它,现在我尝试着用我这几天跟着侯捷老师学来的写一下我的理解。 int a = 4 int s = a int* p = a(指向第一行的a) int a1 = 5; int s2 = s; memory int a = 4; //可以得到内存里开辟了一个空间……

一、引用

引用可以说是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);//调用端后两种写法一样,更好理解,用引用也更快;

本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐