当前课程知识点:基于Linux的C++ >  第七讲 指针与引用 >  7.9 引用 >  LinuxCPP0709

返回《基于Linux的C++》慕课在线视频课程列表

LinuxCPP0709在线视频

LinuxCPP0709

下一节:LinuxCPP0710

返回《基于Linux的C++》慕课在线视频列表

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 &”

对于一个常量的一个引用

它只能引用这个常量

你不能通过引用来改变

目标数据对象的那个值

引用本身也不能改变引用对象

因为它是固定挂接好的 它是固定的

其实引用作为函数返回值的重要性

不仅仅体现在这个地方

我们后面会谈到

当我们想重载我们的输出操作符的时候

你就能看到 引用为什么那么重要

没有引用 新的面向对象的那种架构

是非常非常难以实现的

基于Linux的C++课程列表:

第一讲 C/C++基本语法元素

-1.1 提纲

--LinuxCPP0101

-1.2 程序设计的基本概念

--LinuxCPP0102

-1.3 简单C/C++程序介绍

--LinuxCPP0103

-1.4 程序设计的基本流程

--LinuxCPP0104

-1.5 基本语法元素

--LinuxCPP0105

-1.6 程序设计风格

--LinuxCPP0106

-1.7 编程实践

--LinuxCPP0107

-第一讲 C/C++基本语法元素--编程实践提交入口

第二讲 程序控制结构

-2.1 提纲

--LinuxCPP0201

-2.2 结构化程序设计基础

--LinuxCPP0202

-2.3 布尔数据

--LinuxCPP0203

-2.4 分支结构

--LinuxCPP0204

-2.5 break语句

--LinuxCPP0205

-2.6 循环结构

--LinuxCPP0206

-2.7 编程实践

--LinuxCPP0207

-第二讲 程序控制结构--编程实践提交入口

第三讲 函数

-3.1 提纲

--LinuxCPP0301

-3.2 函数声明、调用与定义

--LinuxCPP0302

-3.3 函数调用栈框架

--LinuxCPP0303

-3.4 编程实践

--LinuxCPP0304

-第三讲 函数--编程实践提交入口

第四讲 算法

-4.1 提纲

--LinuxCPP0401

-4.2 算法概念与特征

--LinuxCPP0402

-4.3 算法描述

--LinuxCPP0403

-4.4 算法设计与实现

--LinuxCPP0404

-4.5 递归算法(一)

--LinuxCPP0405

-4.6 递归算法(二)

--LinuxCPP0406

-4.7 容错与计算复杂度

--LinuxCPP0407

-4.8 编程实践

--LinuxCPP0408

-第四讲 算法--编程实践提交入口

第五讲 程序组织与开发方法

-5.1 提纲

--LinuxCPP0501

-5.2 库与接口

--LinuxCPP0502

-5.3 随机数库(一)

--LinuxCPP0503

-5.4 随机数库(二)

--LinuxCPP0504

-5.5 作用域与生存期

--LinuxCPP0505

-5.6 典型软件开发流程(一)

--LinuxCPP0506

-5.7 典型软件开发流程(二)

--LinuxCPP0507

-5.8 编程实践

--LinuxCPP0508

-第五讲 程序组织与开发方法--编程实践提交入口

第六讲 复合数据类型

-6.1 提纲

--LinuxCPP0601

-6.2 字符

--LinuxCPP0602

-6.3 数组(一)

--LinuxCPP0603

-6.4 数组(二)

--LinuxCPP0604

-6.5 结构体

--LinuxCPP0605

-6.6 编程实践

--LinuxCPP0606

-第六讲 复合数据类型--编程实践提交入口

第七讲 指针与引用

-7.1 提纲

--LinuxCPP0701

-7.2 指针基本概念

--LinuxCPP0702

-7.3 指针与函数

--LinuxCPP0703

-7.4 指针与复合数据类型(一)

--LinuxCPP0704

-7.5 指针与复合数据类型(二)

--LinuxCPP0705

-7.6 字符串

--LinuxCPP0706

-7.7 动态存储管理(一)

--LinuxCPP0707

-7.8 动态存储管理(二)

--LinuxCPP0708

-7.9 引用

--LinuxCPP0709

-7.10 编程实践

--LinuxCPP0710

-第七讲 指针与引用--编程实践提交入口

第八讲 链表与程序抽象

-8.1 提纲

--LinuxCPP0801

-8.2 数据抽象(一)

--LinuxCPP0802

-8.3 数据抽象(二)

--LinuxCPP0803

-8.4 链表(一)

--LinuxCPP0804

-8.5 链表(二)

--LinuxCPP0805

-8.6 链表(三)

--LinuxCPP0806

-8.7 链表(四)

--LinuxCPP0807

-8.8 函数指针(一)

--LinuxCPP0808

-8.9 函数指针(二)

--LinuxCPP0809

-8.10 抽象链表(一)

--LinuxCPP0810

-8.11 抽象链表(二)

--LinuxCPP0811

-8.12 编程实践

--LinuxCPP0812

-第八讲 链表与程序抽象--编程实践提交入口

第九讲 类与对象

-9.1 提纲

--LinuxCPP0901

-9.2 程序抽象与面向对象

--LinuxCPP0902

-9.3 类类型

--LinuxCPP0903

-9.4 对象(一)

--LinuxCPP0904

-9.5 对象(二)

--LinuxCPP0905

-9.6 类与对象的成员(一)

--LinuxCPP0906

-9.7 类与对象的成员(二)

--LinuxCPP0907

-9.8 类与对象的成员(三)

--LinuxCPP0908

-9.9 继承(一)

--LinuxCPP0909

-9.10 继承(二)

--LinuxCPP0910

-9.11 继承(三)

--LinuxCPP0911

-9.12 多态(一)

--LinuxCPP0912

-9.13 多态(二)

--LinuxCPP0913

-9.14 编程实践

--LinuxCPP0914

-第九讲 类与对象--编程实践提交入口

第十讲 操作符重载

-10.1 提纲

--LinuxCPP1001

-10.2 四则运算符重载(一)

--LinuxCPP1002

-10.3 四则运算符重载(二)

--LinuxCPP1003

-10.4 关系与下标操作符重载

--LinuxCPP1004

-10.5 赋值操作符重载(一)

--LinuxCPP1005

-10.6 赋值操作符重载(二)

--LinuxCPP1006

-10.7 赋值操作符重载(三)

--LinuxCPP1007

-10.8 赋值操作符重载(四)

--LinuxCPP1008

-10.9 赋值操作符重载(五)

--LinuxCPP1009

-10.10 流操作符重载(一)

--LinuxCPP1010

-10.11 流操作符重载(二)

--LinuxCPP1011

-10.12 流操作符重载(三)

--LinuxCPP1012

-10.13 操作符重载总结

--LinuxCPP1013

-10.14 编程实践

--LinuxCPP1014

-第十讲 操作符重载--编程实践提交入口

第十一讲 泛型编程

-11.1 提纲

--LinuxCPP1101

-11.2 泛型编程概览

--LinuxCPP1102

-11.3 异常处理机制(一)

--LinuxCPP1103

-11.4 异常处理机制(二)

--LinuxCPP1104

-11.5 运行期型式信息(一)

--LinuxCPP1105

-11.6 运行期型式信息(二)

--LinuxCPP1106

-11.7 模板与型式参数化

--LinuxCPP1107

-11.8 题外话:术语翻译

--LinuxCPP1108

-11.9 泛型编程实践(一)

--LinuxCPP1109

-11.10 泛型编程实践(二)

--LinuxCPP1110

-11.11 泛型编程实践(三)

--LinuxCPP1111

-11.12 泛型编程实践(四)

--LinuxCPP1112

-11.13 泛型编程实践(五)

--LinuxCPP1113

-11.14 泛型编程实践(六)

--LinuxCPP1114

-11.15 泛型编程实践(七)

--LinuxCPP1115

-11.16 泛型编程实践(八)

--LinuxCPP1116

-11.17 泛型编程实践(九)

--LinuxCPP1117

-11.18 泛型编程实践(十)

--LinuxCPP1118

-11.19 编程实践

--LinuxCPP1119

-第十一讲 泛型编程--编程实践提交入口

第十二讲 Linux系统编程基础

-12.1 提纲

--LinuxCPP1201

-12.2 程序执行环境(一)

--LinuxCPP1202

-12.3 程序执行环境(二)

--LinuxCPP1203

-12.4 程序执行环境(三)

--LinuxCPP1204

-12.5 程序执行环境(四)

--LinuxCPP1205

-12.6 输入输出(一)

--LinuxCPP1206

-12.7 输入输出(二)

--LinuxCPP1207

-12.8 文件系统

--LinuxCPP1208

-12.9 设备

--LinuxCPP1209

-12.10 库(一)

--LinuxCPP1210

-12.11 库(二)

--LinuxCPP1211

-12.12 makefile文件(一)

--LinuxCPP1212

-12.13 makefile文件(二)

--LinuxCPP1213

-12.14 makefile文件(三)

--LinuxCPP1214

-12.15 编程实践

--LinuxCPP1215

-第十二讲 Linux系统编程基础--编程实践提交入口

第十三讲 进程编程

-13.01 提纲

--LinuxCPP1301

-13.02 进程基本概念

--LinuxCPP1302

-13.03 信号

--LinuxCPP1303

-13.04 进程管理(一)

--LinuxCPP1304

-13.05 进程管理(二)

--LinuxCPP1305

-13.06 进程管理(三)

--LinuxCPP1306

-13.07 进程间通信(一)

--LinuxCPP1307

-13.08 进程间通信(二)

--LinuxCPP1308

-13.09 进程间通信(三)

--LinuxCPP1309

-13.10 进程间通信(四)

--LinuxCPP1310

-13.11 进程池

--LinuxCPP1311

-13.12 编程实践

--LinuxCPP1312

-第十三讲 进程编程--编程实践提交入口

第十四讲 线程编程

-14.1 提纲

--LinuxCPP1401

-14.2 线程基本概念

--LinuxCPP1402

-14.3 线程管理(一)

--LinuxCPP1403

-14.4 线程管理(二)

--LinuxCPP1404

-14.5 线程管理(三)

--LinuxCPP1405

-14.6 线程管理(四)

--LinuxCPP1406

-14.7 线程同步机制(一)

--LinuxCPP1407

-14.8 线程同步机制(二)

--LinuxCPP1408

-14.9 C++11线程库(一)

--LinuxCPP1409

-14.10 C++11线程库(二)

--LinuxCPP1410

-14.11 C++11线程库(三)

--LinuxCPP1411

-14.12 C++11线程库(四)

--LinuxCPP1412

-14.13 C++11线程库(五)

--LinuxCPP1413

-14.14 编程实践

--LinuxCPP1414

-第十四讲 线程编程--编程实践提交入口

第十五讲 网络编程

-15.1 提纲

--LinuxCPP1501

-15.2 Internet网络协议

--LinuxCPP1502

-15.3 套接字(一)

--LinuxCPP1503

-15.4 套接字(二)

--LinuxCPP1504

-15.5 编程实践

--LinuxCPP1505

-第十五讲 网络编程--编程实践提交入口

课程文档

-课程PDF文件

LinuxCPP0709笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。