引用的意义

  • 引用作为变量别名而存在,因此在一些场合可以代替指针
  • 引用相对于指针来说具有更好的可读性和实用性
  • swap函数的实现对比:

void swap(int* a, int* b)

{

int t = *a;

*a = *b;

*b = t;

}

void swap_yinyong(int& a,int& b)

{

int t = a;

a = b;

b = t;       

}

int main()

{

int a = 1;

int b = 2;

printf("a = %d,b = %d\n",a,b);

swap(&a,&b);

printf("指针版本:a = %d, b = %d\n",a,b);

swap_yinyong(a,b);

printf("引用版本:a = %d, b = %d\n",a,b);

return 0;

}

特殊的引用:const引用

  • 在C++中可以声明const引用

Const Type& name = val;

Const 引用让变量拥有只读属性

int main()

{

int a = 1;

const int& b = a;

int *p = (int*)&b;

//b = 5; 编译报错,显示不能对只读变量赋值

*p = 5; //要想改变只读变量,可以对他的指针进行操作

printf("a = %d\n",a);

return 0;

}

  • 当使用常量对const引用进行初始化时,C++编译器会为常量分配空间并将引用名作为这段空间的别名

int main()

{

const int& b = 1;

int *p = (int*)&b;

*p = 5; //要想改变只读变量,可以对他的指针进行操作

printf("a = %d\n",b);

return 0;

}

使用常量对const引用初始化后将生成一个只读变量

引用在C++中的内部实现是一个指针常量

  • 因此引用占用的内存空间与指针相同(一般是四个字节)
  • 从使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这一细节

struct Tref

{

char& c;       

};

int main()

{

char c = 'c';

char& rc = c;       

Tref ref = { c };

printf("sizeof(char&)%d\n",sizeof(char&));       

printf("sizeof(rc)%d\n",sizeof(rc));

printf("sizeof(ref.c)%d\n",sizeof(ref.c));

printf("sizeof(Tref)%d\n",sizeof(Tref));

return 0;

}

struct Tref

{

char* before;

char& ref;

char* after;       

};

int main()

{

char a = 'a';

char b = 'b';       

char c = 'c';

Tref r = {&a,b,&c};

printf("sizeof(r)%d\n",sizeof(r));

printf("sizeof(Tref.before)%d\n",sizeof(r.before));

printf("sizeof(Tref.after)%d\n",sizeof(r.after));

printf("&r.before=%p\n",&r.before);

printf("&r.after= %p\n",&r.after);

return 0;

}

引用的意义

  • C++中的引用大多数情况下能够代替指针
  • 功能性:可以满足多数需要使用指针的场合
  • 安全性:可以避开由于指针操作不当而带来的内存错误
  • 操作性:简单易用,又不失功能强大

小结:

  • 引用作为变量别名而存在旨在代替指针
  • const引用可以使得变量具有只读属性
  • 引用的最终本质为为指针
  • 引用可以尽可能的避开内存错误

C++中引用的本质分析的更多相关文章

  1. C++中引用的本质

    一般的教材上讲到引用时,都是说"引用是对象的一个别名".我认为这种定义是不清晰的,不利于初学者理解引用.至少我自己曾经被这个定义困扰了一段时间.到底什么是"别名" ...

  2. C++中引用的本质是什么?

    一般的教材上讲到引用时,都是说“引用是对象的一个别名”.我认为这种定义是不清晰的,不利于初学者理解引用.至少我自己曾经被这个定义困扰了一段时间.到底什么是“别名”? 实际上,引用的实质是位于xxxxx ...

  3. c语言中函数调用的本质从汇编角度分析

    今天下午写篇博客吧,分析分析c语言中函数调用的本质,首先我们知道c语言中函数的本质就是一段代码,但是给这段代码起了一个名字,这个名字就是他的的这段代码的开始地址 这也是函数名的本质,其实也就是汇编中的 ...

  4. iOS中引用计数内存管理机制分析

    在 iOS 中引用计数是内存的管理方式,虽然在 iOS5 版本中,已经支持了自动引用计数管理模式,但理解它的运行方式有助于我们了解程序的运行原理,有助于 debug 程序. 操作系统的内存管理分成堆和 ...

  5. flask中路由的本质源码分析

    flask中url的本质: 吧url和视图函数封装到一个Rule对象里面去了,并且吧这个对象添加到url_map中 Rule={"url":'/index','method':'i ...

  6. Android XML中引用自定义内部类view的四个why

    今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类v ...

  7. C++中引用和指针详解

    先来分析指针这个东东: 从概念上讲,指针本质上就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 上面的图表示了程序运行时变量的值 ...

  8. C++解析(4):引用的本质

    0.目录 1.引用的意义 2.特殊的引用 3.引用的本质 4.函数返回引用 5.小结 1.引用的意义 引用作为变量別名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注 ...

  9. C++ 类的多态五(多态的语法本质分析)

    //多态的语法本质分析 #include<iostream> using namespace std; /* 三种易混淆的多态场景 */ class Point{ public: Poin ...

随机推荐

  1. AutoHotkey调用VBA实现批量精确筛选数据透视表某字段内容。

    如上图,想在数据透视表中只显示红色区域的内容,手动勾选就比较繁琐. 实现思路: 先复制红色的内容. 鼠标停留在数据透视表[型号]列的任意数据上(通过该单元格可以获取数据透视表和字段) 由于数据透视表的 ...

  2. 名词后变为复数+s,或者+es等怎么读

    , 以ce,se,ze, (d)ge等结尾的词 加 -s 读 /iz/ license-licenses, office offices 最佳答案1: 当名词后加-e(-es)变成复数,动词单数第三人 ...

  3. ZT JAVA WeakReference

    JAVA WeakReference 分类: JAVA 2012-08-28 16:08 305人阅读 评论(0) 收藏 举报 javareferencehashmapcacheclassnull 在 ...

  4. 一些通过SAP ABAP代码审查得出的ABAP编程最佳实践

    1. 这两个IF ELSE分支里检测的条件其实逻辑上来说都是同一类,应该合并到一个IF分支里进行检查: It is an expensive operation to open a file in a ...

  5. Wifi密码破解

    Wifi密码破解1:通过字典(暴力)破解WIFI密码   简单破解WEP/WPA/WPA2加密的WIFI密码,平台kali-linux 工具:Aircrack-ng 过程很简单:先抓含有正确密码的握手 ...

  6. codeforces Flipping Game 题解

    版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...

  7. JavaScript读取本地json文件

    JavaScript读取本地json文件 今天调试了一上午,通过jQuery读取本地json文件总是失败,始终找不出原因,各种方法都试了 开始总以为是不是json格式的问题.高了半天不行 后来读了一个 ...

  8. spring使用Redis自定义前缀后缀名(去掉SimpleKey []+自定义)

    spring中自动加上 SimpleKey [] 解决方案 一.自定义后缀名 1.定义类实现KeyGenerator接口 MyKeyGenerator package com.wbg.springRe ...

  9. cmd进入指定的文件夹

    怎么利用cmd进入指定的文件夹呢? 1:win+r ——cmd 2:进入要到达的盘符 (比如我要进入d盘) 3:然后通过  cd d:\project    进入指定的文件夹

  10. NOIP2018(更新中)

    \(Day_1T_1\) 铺设道路 (Link) 现在你有一个序列,每一个\(i\)有一个深度\(Deep[i]\),现在你可以选择任意的区间,将整个区间的\(Deep\)都减少\(1\).但前提是这 ...