引用是C语言中没有,而在C++中又很重要的一个概念,通过应用,可以得到变量本身,相对于得到变量的值而言,有更大的操作空间。

普通引用

变量的本质

变量名实质上是一段连续存储空间的别名,是一个标号

程序中通过变量来申请并命名内存空间

通过变量的名字可以使用存储空间

引用是C++的概念,属于C++编译器对C的扩展

int main()
{
int a = 0;
int &b = a;
b = 10; return 0;
}

引用的概念

  • 在C++中新增加了引用的概念
  • 引用可以看作一个已定义变量的别名
  • 引用的语法:Type& name = var;
  • 引用作为函数参数声明时不进行初始化
int main()
{
int a = 10;
int &b = a;
b = 10;
cout<<"b--->"<<a<<endl;
printf("a:%d\n", a);
printf("b:%d\n", b);
printf("&a:%d\n", &a);
printf("&b:%d\n", &b); system("pause");
return 0;
}

引用的理解

  1. 普通引用在声明时必须用其它的变量进行初始化
  2. 引用作为其它变量的别名而存在,因此在一些场合可以代替指针,引用相对于指针来说具有更好的可读性和实用性
int swap(int &a, int &b)
{
int t = a;
a = b;
b = t;
return 0;
}
int swap(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
return 0;
}
  1. 普通引用拥有自己的内存空间,有地址,是一个常量,相当于一个常指针,char *const p
struct Teacer {
int &a;
int &b;
};
int main()
{
printf("sizeof(Teacher) %d\n", sizeof(Teacer));
system("pause");
return 0;
}
  1. 引用的本质
  • 引用在C++中的内部实现是一个常指针
Type& name <=> Type* const name
  • C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同
  • 从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
void func(int &a)
{
a = 10;
}
void func(int *const a)
{
*a = 10;
}
  1. 当函数返回值为引用时,若返回栈变量,不能成为其它引用的初始值,不能作为左值使用。若返回静态变量或全局变量,可以成为其他引用的初始值,即可作为右值使用,也可作为左值使用。C++链式编程中,经常用到引用
  2. 当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)

常引用

const引用(使用变量初始化const引用)

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

const Type& name = var;

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

int a = 10;
const int &b = a;

此时便不可以使用b来修改a的值了,只能使用a自身和指针。

const引用(使用字面量常量初始化const引用)

int main()
{
const int &a = 10; //去掉const则编译报错
int *p = (int *)&a; //注意需要(int *)
*p = 12;
printf("a:%d", a); system("pause");
return 0;
}

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

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

const引用总结

Const&相当于const int * const e

普通引用相当于int *const e

例子

int& func1()
{
static int a = 0;
return a;
} int& func2()
{
int a = 0;
return a;
} int main()
{
int a = func2();
int& b = func2();
func1() = 10; printf("a = %d\n", a);
printf("b = %d\n", b);
printf("f() = %d\n", f()); system("pause");
return 0;
}

C++学习笔记-引用的更多相关文章

  1. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

  2. cocos2dx 3.0 学习笔记 引用cocostudio库 的环境配置

    cocostudio创建UI并应用时须要引用cocostudio库,须要额外的环境配置: 之前已经搭配好了基础的开发环境,包含 1) JDK 2) Python 2.7 3) ant 4) visua ...

  3. C++学习笔记---引用的本质

    本质:引用本质上是C++内部实现的一个指针常量 发现是引用的话,自动帮我们转换成指针常量 运行后,发现修改ref的值那么a的值也会一起改变,这就说明了引用的本质就是指针

  4. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  6. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...

  9. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

随机推荐

  1. Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)

    kubectl top pod --all-namespaces Error from server (NotFound): the server could not find the request ...

  2. [CCTF] pwn350

    0x00: 之前打了CCTF,在CCTF的过程中遇到一个比较有意思的思路,记录一下. 0x01: 可以看到,这是一个 fmt 的漏洞,不过很简单,接收的输入都在stack中,可以确定输入在栈中的位置, ...

  3. MessagePack Java 0.6.X List, Map 对象的序列化和反序列化

    为了序列化原生的容器对象例如  List 和 Map 对象,你必须使用 Template. Template 对象是 serializer 和 deserializer 的配对.例如,为了序列化一个  ...

  4. 『NOIP 2019Day2 T3』 保卫王国(defense)

    重温NOIP2018的试题,发现只要好好想想还是能想出一些东西的. 比如说本题是一个DDP的模板题,硬是做成了倍增优化DP的题目. 对于给出的$n$个节点的树,每个点都有点权$v_i$,共$Q$次询问 ...

  5. AcWing:165. 小猫爬山(dfs + 剪枝)

    翰翰和达达饲养了N只小猫,这天,小猫们要去爬山. 经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). 翰翰和达达只好花钱让它们坐索道下山. 索道上的缆 ...

  6. MySQL_(Java)分页查询MySQL中的数据

    MySQL_(Java)使用JDBC向数据库发起查询请求 传送门 MySQL_(Java)使用JDBC创建用户名和密码校验查询方法 传送门 MySQL_(Java)使用preparestatement ...

  7. [CSP-S模拟测试]:序列(二分答案+树状数组)

    题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...

  8. fatal error C1189: #error: "Oops: min() and/or max() are defined as preprocessor macros. Define NOMINMAX macro before including any system headers!"

    1.问题描述 vs2015 使用pg数据库的C++库文件4.0.1版本libpqxx.dll,包含头文件#include "pqxx\pqxx" 出现这个错误: fatal err ...

  9. ftp协议在linux上的配置

    第一步:安装 yum install -y vsftpd 第二步:启动ftp服务:vsftpd [root@localhost ~]# systemctl start vsftpd 第三步:查看启动状 ...

  10. 19个JavaScript简化编码小技巧

    这篇文章适合任何一位基于JavaScript开发的开发者.我写这篇文章主要涉及JavaScript中一些简写的代码,帮助大家更好理解一些JavaScript的基础.希望这些代码能从不同的角度帮助你更好 ...