C++学习之路(二):引用
(1)引用是变量的别名
引用的基本定义格式:类型 &引用名 = 变量名
例如:int a = 1; int &b = a,这里b是a的别名,b与a都指向了同一块内存单元。
对于引用而言,其底层实现是通过const指针的方式实现的。相较于c,引用是c++引入的一种更为方便的表示方式。
引用不是一种变量,其仅仅是变量的别名;
引用没有自己独立的内存空间,引用需要与其引用的变量共享内存空间;
对引用所做的改变实际上是会影响到对应的变量;
引用在定义时需要进行初始化,一旦引用被初始化后,其不能够被重新指向其他变量。
(2)const引用
const引用是指向const对象的引用。
例子:
const int a = 100;
const int &b = a; //正确,引用b为const类型,可以作为const变量a的别名
int &c = a; //错误,c为普通引用,不可以作为const变量a的别名,因为对于c而言,可以对c所引用的变量进行修改(例如c += 1),但a为const变量,不能够被修改。
(3)按引用进行传递
引用传递的方式是在函数形参中加入引用描述符&。如swap(int &a, int &)
值传递:swap(int a, int b)。形参将根据实参生成新的内存单元,作用域仅在当前函数栈帧内,函数结束后数据弹栈。故不能够对实参进行修改;
指针传递:swap(int *a, int *b)。形参传入的是变量的地址,在当前函数栈帧中对地址中的数据进行修改,函数结束后数据弹栈,但实参对应地址中的数据已经被修改。但指针传递的方式
可能会使程序难以阅读,c语言没有引用特性时采用指针传递的方式较多;
引用传递:swap(int &a, int &b)。对形参的任何操作都能够改变相应的实参的数据,相较于指针传递方式而言,程序较为方便。
(4)引用作为函数返回值
例子:
int &add(int a, int b)
{
int sum;
sum = a + b;
return sum;
} int main(void)
{
int n = add(, );
int &n2 = add(, );
cout << "n2=" << n2 << endl;
cout << "n=" << n << endl;
cout << "n2= "<<n2<<endl;
return ;
}
main函数中,add函数返回sum的引用,n为普通变量,n2为引用(引用的是原理sum拥有的内存区域)。上述结果程序可能输出如下:
n2 = 11
n = 7
n2 = 1474313670
原因为:n为普通变量,拥有独立的内存区域,它接收返回时sum所属区域的值,多次打印n的值都为7。但对于n2而言,其自身是一个引用,sum所在的内存区域在函数返回后弹栈就清空,
该块内存变为dirty,之后很可能被覆盖了其他不确定的值,所以每次打印都可能不是一个定值。
上述程序也可能在运行时崩溃,不打印输出任何结果。
结论:不能够返回对局部变量的引用,否则程序极有可能崩溃。
(5)指针和引用
引用访问是对变量的直接访问,指针保存的是变量的地址,对变量是间接访问;
引用是变量的别名,本身不单独分配独立的内存空间,但指针有自己的内存空间;
引用需在声明时进行初始化,并且在初始化完成后不能再指向其他变量,但指针可以;
C++学习之路(二):引用的更多相关文章
- Redis——学习之路二(初识redis服务器命令)
上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息 s ...
- zigbee学习之路(二)点亮LED
一.前言 今天,我来教大家如何点亮led,这也是学习开发板最基础的步骤了. 二.原理分析 cc2530芯片跟虽然是51的内核,但是它跟51单片机还是有区别的,51单片机不需要对IO口进行配置,而cc2 ...
- Spring Boot 学习之路二 配置文件 application.yml
一.创建配置文件 如图所示,我们在resources文件夹中新建配置文件application.yml 结构图 二.一些基本配置 server: port: 8090 //配置端口 session ...
- Jquery学习之路(二) 实现table样式的设定
上一篇jquery实现checkbox的全选,得到了一些朋友的建议,其中插件的定义我的确不太清楚,也闹了个笑话,有些朋友建议我去看<锋利的Jquery>,说实话正在看了.由于正在学习中,我 ...
- Android开发学习之路-二维码学习
这个月装逼有点少了,为什么呢,因为去考软件射鸡师了,快到儿童节了,赶紧写篇博纪念一下逝去的青春,唔,请忽略这句话. 二维码其实有很多种,但是我们常见的微信使用的是一种叫做QRCode的二维码,像下面这 ...
- Python学习之路二
今天主要学习了列表,python的列表真的事太强大了,由于内容比较多,今天就先简单的介绍一下新学的几个成员函数吧. 首先我们要了解list是一种序列类型,其构造方式有四种形式: (1)空列表 [] ( ...
- Spring学习之路二——概念上理解Spring
一.概念. Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Develop ...
- .net core+Spring Cloud学习之路 二
前言: 原本计划这次写一下搭建eureka群集.但是发现上次写的只是服务的注册,忘了写服务的发现,所以这次先把服务发现补上去. 我们基于上篇文章,再新建两个.net core web api项目,分别 ...
- react.js学习之路二
看react.js对我来说真的不是难不难的问题,问题是我的思路太难转变了,真是坑死我了,react里面的坑也很多.算了,这些抱怨没啥用,记录一下今天学习的内容. 今天看了to-do-list经典示例 ...
- python学习之路 二 :基本数据类型
本节重点 理解什么是变量? 掌握各种数据类型 理解可变类型和不可变类型 一.变量和常量 变量: 作用:存贮程序的中间结果在内存里,以备后边的程序调用 定义规范: 变量名只能是 字母.数字活下划线的任意 ...
随机推荐
- Redis源码剖析
Redis源码剖析和注释(一)---链表结构 Redis源码剖析和注释(二)--- 简单动态字符串 Redis源码剖析和注释(三)--- Redis 字典结构 Redis源码剖析和注释(四)--- 跳 ...
- K-means聚类算法与EM算法
K-means聚类算法 K-means聚类算法也是聚类算法中最简单的一种了,但是里面包含的思想却不一般. 聚类属于无监督学习.在聚类问题中,给我们的训练样本是,每个,没有了y. K-means算法是将 ...
- 【bzoj5110】[CodePlus2017]Yazid 的新生舞会 Treap
题目描述 求一个序列所有的子区间,满足区间众数的出现次数大于区间长度的一半. 输入 第一行2个用空格隔开的非负整数n,type,表示序列的长度和数据类型.数据类型的作用将在子任务中说明. 第二行n个用 ...
- 【bzoj1704】[Usaco2007 Mar]Face The Right Way 自动转身机 贪心
题目描述 农夫约翰有N(1≤N≤5000)只牛站成一排,有一些很乖的牛朝前站着.但是有些不乖的牛却朝后站着.农夫约翰需要让所有的牛都朝前站着.幸运的是约翰最近买了一个自动转身机.这个神奇的机器能使K( ...
- Java基础之开关语句详解
switch 语句是单条件多分支的开关语句,它的一般格式定义如下(其中break语句是可选的): switch(表达式) { case 常量值: 若干个语句 break; case 常量值: 若干个 ...
- BZOJ4755 JSOI2016扭动的回文串(二分答案+哈希)
显然答案应该是由单串以某位置为中心的极长回文串继续在另一个串里拓展得到的.枚举中间位置二分答案,哈希判断即可.注意考虑清楚怎么处理偶回文,比如像manacher一样加分隔符. #include< ...
- Python程序性能分析模块----------cProfile
cProfile分析器可以用来计算程序整个运行时间,还可以单独计算每个函数运行时间,并且告诉你这个函数被调用多少次 def foo(): pass import cProfile cProfile.r ...
- BZOJ1041 [HAOI2008]圆上的整点 【数学】
1041: [HAOI2008]圆上的整点 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4631 Solved: 2087 [Submit][S ...
- HashMap & SparseArray & ArrayMap 简单说明
HashMap 使用有限一维拉链数组存储结构,鉴于所用Entry结构{key, value, nextExtry},Key的hash值用于取余获得所属的数组行下标,通过链表方式顺序存放所有余数相同的各 ...
- MyBatis代码生成工具mybatis-generator在Myeclipse10中的使用
一.在MyEclipse安装目录下新建myPlugin目录,如下图所示: 二.将 mybatis.zip 里面的文件放在MyEclipse的dropins目录下,如下图所示: 三.在Myeclipse ...