当前课程知识点:基于Linux的C++ > 第七讲 指针与引用 > 7.9 引用 > LinuxCPP0709
接下来的最后一小节
就是我们的引用类型
引用类型和指针类型是不一样的
它的基本定义格式是数据类型、“&”
后面跟着一个变量的名称
初始化为被引用的变量的名称
我有一个整型量a
然后int & ref 初始化成a
引用是什么东西
同学们记住这一句话:
一 引用类型的变量不占用单独的存储空间
二 它仅仅相当于另一个数据对象的一个
别名或者是绰号
与那个原始对象共享同样的存储空间
而ref就是那个a
凡是在程序中对ref的操作
操作的就是那个a
所以 引用类型的变量
必须在定义的时候对它进行初始化
不初始化是不行的
除非是什么 引用类型的量作为函数参数
引用类型的这个关联关系
是维持不变的 ref就引用a
对引用ref的任何操作
都是对a的直接的操作
ref就是a那个变量的别名
我们来看这样一个例子
怎么使用引用
来操作我们的目标数据对象
定义一个整型量a
然后定义int & ref 然后把它初始化成a
这样ref作为一个引用
它就会和我们的a整型量是一样的
所以a赋值为5,cout输出a和ref
你会看到两者是相同的
然后把ref又设成8
然后继续cout输出a和ref
你会看到a和ref还是相同的
它们两者其实就是一回事
a就是ref,ref就是a
对于我们这一道题来讲
它们的表现就是这个样子
所以引用就是那个原始的量的一个别名
那你说就我刚才那个例子
我定义一个引用有意义吗 没有意义
因为那个a的名字随时可以用
用ref干嘛呢 起个外号有什么用呢
那么引用最重要的用途
是作为函数的参数
当引用作为函数参数的时候
它就给我们产生了一个新的
参数传递机制 叫做引用传递
注意 它不是值传递
它传递的是原始那个数据的一个引用
看例子 函数原型这么写:
返回值类型 函数名称(类型 & 参数名称)
这就是引用的标准格式
你比如说我写这个函数void Swap(int & x, int & y )
我传递两个引用:x和y
内部实现的时候
就像普通的整型量一样写:
t赋值为x,x赋值为y,y赋值为t
三步互换 就像普通整型量一样
你就按这个方式去写就可以了
这就是引用
调用的时候int a初始化为10
b初始化为20,Swap(a,b)
前面不用写“&”也不用写“*”
注意 我们前面特别谈到过
“&”和“*”是可逆的 那是指针
这是引用 不可逆
就像它是一个普通量一样 写a、b
引用传递的时候
它会把a和x给等价起来
b和y等价起来
什么意思 它的意思就是
在Swap这个函数的内部
x就是main函数里面变量a的别名
b就对应着Swap函数里面的y
y就是b的别名
所以在Swap里面
对x和y所做的任何改变
就是对main函数里边的
a和b所做的操作
x就是a,y就是b
Swap函数里面的x
就是main函数里面的a
y就是b
如果没有引用 那就只有值传递
你要直接写
那就只能产生一个拷贝动作
a拷贝给x,b拷贝给y
然后你x、y不管怎么倒腾
a和b不会变
因为两个是两个量 完全无关
要么你就得使用指针
你传a、b的地址进去
但是你一旦倒腾*x、*y
那么a、b就会变了
这是我们讲指针的时候特别谈到的
但是你现在 一旦使用引用
x就是那个a,y就是那个b
它是那个别名
所以你在Swap函数里面用的
就是main函数里面的a、b
它最大的好处就是
将主调函数中的两个量a、b
把它们引入到了Swap这个函数的名空间
换了一个名字访问它
这就是我们的引用
作为函数参数的时候 它的传递机制
好处就是它可以直接修改
我们的实际参数的值
而不是像指针那样修改指针所指向的
目标参数的值
引用 直接修改的就是我们的
实际参数的值
还有一个地方
引用可以作为函数的返回值
它作为函数返回值的时候
它有一个很特殊地方 就是什么呢
不会生成这样一个副本
比如说int & Inc 有一个递增操作
我想把alpha这个数据
累加到我们的dest这样一个量上面去
这三个都是引用传递
我要把alpha累加到dest上面去
然后返回dest
就直接按照这个方式去写就行了
这样的话 函数调用的时候
int a初始化为10,b初始化为20
我就Inc(a,b) 这么写没有问题
然后你还可以这么写
c赋值为Inc(a,b)++ 把这个Inc累加做完
累加完以后 把b累加到a上面去
然后我直接把累加完的结果再加1
然后把它结果赋值给c
这是非常重要一个地方
回到前面Inc这个函数
它这里面有一个“const int &”
对于一个常量的一个引用
它只能引用这个常量
你不能通过引用来改变
目标数据对象的那个值
引用本身也不能改变引用对象
因为它是固定挂接好的 它是固定的
其实引用作为函数返回值的重要性
不仅仅体现在这个地方
我们后面会谈到
当我们想重载我们的输出操作符的时候
你就能看到 引用为什么那么重要
没有引用 新的面向对象的那种架构
是非常非常难以实现的
-1.1 提纲
-1.2 程序设计的基本概念
-1.3 简单C/C++程序介绍
-1.4 程序设计的基本流程
-1.5 基本语法元素
-1.6 程序设计风格
-1.7 编程实践
-第一讲 C/C++基本语法元素--编程实践提交入口
-2.1 提纲
-2.2 结构化程序设计基础
-2.3 布尔数据
-2.4 分支结构
-2.5 break语句
-2.6 循环结构
-2.7 编程实践
-第二讲 程序控制结构--编程实践提交入口
-3.1 提纲
-3.2 函数声明、调用与定义
-3.3 函数调用栈框架
-3.4 编程实践
-第三讲 函数--编程实践提交入口
-4.1 提纲
-4.2 算法概念与特征
-4.3 算法描述
-4.4 算法设计与实现
-4.5 递归算法(一)
-4.6 递归算法(二)
-4.7 容错与计算复杂度
-4.8 编程实践
-第四讲 算法--编程实践提交入口
-5.1 提纲
-5.2 库与接口
-5.3 随机数库(一)
-5.4 随机数库(二)
-5.5 作用域与生存期
-5.6 典型软件开发流程(一)
-5.7 典型软件开发流程(二)
-5.8 编程实践
-第五讲 程序组织与开发方法--编程实践提交入口
-6.1 提纲
-6.2 字符
-6.3 数组(一)
-6.4 数组(二)
-6.5 结构体
-6.6 编程实践
-第六讲 复合数据类型--编程实践提交入口
-7.1 提纲
-7.2 指针基本概念
-7.3 指针与函数
-7.4 指针与复合数据类型(一)
-7.5 指针与复合数据类型(二)
-7.6 字符串
-7.7 动态存储管理(一)
-7.8 动态存储管理(二)
-7.9 引用
-7.10 编程实践
-第七讲 指针与引用--编程实践提交入口
-8.1 提纲
-8.2 数据抽象(一)
-8.3 数据抽象(二)
-8.4 链表(一)
-8.5 链表(二)
-8.6 链表(三)
-8.7 链表(四)
-8.8 函数指针(一)
-8.9 函数指针(二)
-8.10 抽象链表(一)
-8.11 抽象链表(二)
-8.12 编程实践
-第八讲 链表与程序抽象--编程实践提交入口
-9.1 提纲
-9.2 程序抽象与面向对象
-9.3 类类型
-9.4 对象(一)
-9.5 对象(二)
-9.6 类与对象的成员(一)
-9.7 类与对象的成员(二)
-9.8 类与对象的成员(三)
-9.9 继承(一)
-9.10 继承(二)
-9.11 继承(三)
-9.12 多态(一)
-9.13 多态(二)
-9.14 编程实践
-第九讲 类与对象--编程实践提交入口
-10.1 提纲
-10.2 四则运算符重载(一)
-10.3 四则运算符重载(二)
-10.4 关系与下标操作符重载
-10.5 赋值操作符重载(一)
-10.6 赋值操作符重载(二)
-10.7 赋值操作符重载(三)
-10.8 赋值操作符重载(四)
-10.9 赋值操作符重载(五)
-10.10 流操作符重载(一)
-10.11 流操作符重载(二)
-10.12 流操作符重载(三)
-10.13 操作符重载总结
-10.14 编程实践
-第十讲 操作符重载--编程实践提交入口
-11.1 提纲
-11.2 泛型编程概览
-11.3 异常处理机制(一)
-11.4 异常处理机制(二)
-11.5 运行期型式信息(一)
-11.6 运行期型式信息(二)
-11.7 模板与型式参数化
-11.8 题外话:术语翻译
-11.9 泛型编程实践(一)
-11.10 泛型编程实践(二)
-11.11 泛型编程实践(三)
-11.12 泛型编程实践(四)
-11.13 泛型编程实践(五)
-11.14 泛型编程实践(六)
-11.15 泛型编程实践(七)
-11.16 泛型编程实践(八)
-11.17 泛型编程实践(九)
-11.18 泛型编程实践(十)
-11.19 编程实践
-第十一讲 泛型编程--编程实践提交入口
-12.1 提纲
-12.2 程序执行环境(一)
-12.3 程序执行环境(二)
-12.4 程序执行环境(三)
-12.5 程序执行环境(四)
-12.6 输入输出(一)
-12.7 输入输出(二)
-12.8 文件系统
-12.9 设备
-12.10 库(一)
-12.11 库(二)
-12.12 makefile文件(一)
-12.13 makefile文件(二)
-12.14 makefile文件(三)
-12.15 编程实践
-第十二讲 Linux系统编程基础--编程实践提交入口
-13.01 提纲
-13.02 进程基本概念
-13.03 信号
-13.04 进程管理(一)
-13.05 进程管理(二)
-13.06 进程管理(三)
-13.07 进程间通信(一)
-13.08 进程间通信(二)
-13.09 进程间通信(三)
-13.10 进程间通信(四)
-13.11 进程池
-13.12 编程实践
-第十三讲 进程编程--编程实践提交入口
-14.1 提纲
-14.2 线程基本概念
-14.3 线程管理(一)
-14.4 线程管理(二)
-14.5 线程管理(三)
-14.6 线程管理(四)
-14.7 线程同步机制(一)
-14.8 线程同步机制(二)
-14.9 C++11线程库(一)
-14.10 C++11线程库(二)
-14.11 C++11线程库(三)
-14.12 C++11线程库(四)
-14.13 C++11线程库(五)
-14.14 编程实践
-第十四讲 线程编程--编程实践提交入口
-15.1 提纲
-15.2 Internet网络协议
-15.3 套接字(一)
-15.4 套接字(二)
-15.5 编程实践
-第十五讲 网络编程--编程实践提交入口