C++必知必会(五) 引用是别名而非指针

引用(reference)是一个现有对象的别名。用对象来初始化引用之后,那么对象的名字或引用的名字都可以用于指向(refer to)该对象:

int a = 12;
int &ra = a;
--ra; // a == 11;
a = 10; // ra = 10;
int *ip = &ra;

人们常常会将引用和指针相混淆,原因大概在于C++编译器通常采用指针的方式实现引用,但引用其实不是指针,其行为和指针并不相同。

在引用和指针之间存在三大区别:其一,不存在空引用(NULL Reference);其二,所有引用都要初始化;其三,一个引用永远指向用来对它初始化的那个对象。比如说,在先前的例子中,引用ra在整个生命期内都指向a。绝大多数对引用的误用都滋生于对这三大区别的理解。

一些编译器可以捕捉到那些明显的创建空引用的尝试:

Employee &anEmployee = *static_cast<Employee*>(0);

然而,编译咕嘟可能无法侦测到不那么明显的创建空引用的尝试,从而导致在运行期发生未定义的行为:

Employee *getAnEmployee();
//...
Employee &anEmployee = *getAnEmployee(); // 可能是糟糕的代码
if (&anEmployee == 0)

如果getAnEmployee返回的是一个空指针,那么其后代码的行为就是未定义的。在这个例子中,最好使用一个指针来存放getAnEmployee返回的结果。

Employee *employee = getAnEmployee();

if (employee)//...

引用必须初始化的要求,意味着当一个引用初始化它所指向的那个对象必须存在。这一点很重要,因此我想再重复一遍:一个引用就是在该引用被初始化之前已经存在的一个对象的别名。一旦一个引用被初始化去指向一个特定的对象,那么该引用以后就不可以再指向别的对象;在一个引用的整个生命期内,该引用被绑定到用于初始化它的那个对象上。实际上,一个引用完成其初始化后,就只是初始化它的那个对象的别名了。这个“别名”属性使得引用常常成为形参的优秀选择。在以下swap函数模板中,形参a和b乃是传递给调用的实参的别名:

template<typename T>
void swap(T &a, T &b)
{
 T temp(a);
 a = b;
 b = temp;
}
//...
int x = 1, y = 2;
swap(x, y);

时间: 2024-12-01 19:55:30

C++必知必会(五) 引用是别名而非指针的相关文章

JavaScript必知必会(五) eval 的使用_javascript技巧

eval eval(parse) parse :里面跟参数字符串,我们知道执行javascript 会编译执行, 改变全局变量的值: var x = ; //定义的全局变量 alert(x);// var g = eval("x="); //eval 会根据当前上下文解析x alert(x);// 在全局作用域引用eval,改变全局作用域的值,不改变局部作用域的值 var g = eval; //全局引用eval var x = "global";//定义全局变量

Visual Studio 使用及调试必知必会

原文:Visual Studio 使用及调试必知必会   一:C# CODING 技巧 1:TODO 然后 CTRL + W + T,打开任务列表,选中 Comments,就会显示所有待做的任务 2:打开所在的文件夹 右键单击任何一个文件选项卡, 选择"打开所在的文件夹",或在 Solution Explorer 的文件上面点右键: 3:比对同一个文件 鼠标向下拖动红框内的图标. 4:按意愿编程 我把它定义为:按意愿编程,即,在写代码过程中,如果觉得需要使用到一个新类,可以先不用创建这

MySQL必知必会

本文链接 http://alex-my.xyz/books/database/MySQL必知必会 http://blog.csdn.net/alex_my/article/details/72357498 1 基础知识 1 主键 唯一标识表中每行的这个列(这组列)称为主键. 应该总是定义主键,虽然并不总是需要主键. 任意两行都不具有相同的主键值. 每一行都必须具有一个主键值,不可为NULL. 2 常用命令 SHOW DATABASES; SHOW TABLES; SHOW COLUMNS FRO

MySQL必知必会之15-20

15.联结表 SQL最强大的功能之一就是能在数据检索查询的执行中联结表.联结是利用SQL的SELECT能执行的最重要的操作. 关系表的设计是要保证把信息分解成多个表,一类数据一个表,各表通过一定的关系互相关联. 外键:外键为某个表的一列,它包含另一个表的主键值,定义了两个表之间的关系. 可伸缩性:能够适应不断增加的工作量而不失败. 15.1 联结 联结是一种机制,用来在一条select语句中关联表,因此称之为联结.使用特殊的语法,可以联结多个表返回一组输出,联结在运行时关联表中正确的行. 15.

Python 程序员必知必会的开发者工具

Python已经演化出了一个广泛的生态系统,该生态系统能够让Python程序员的生活变得更加简单,减少他们重复造轮的工作.同样的理念也适用于工具开发者的工作,即便他们开发出的工具并没有出现在最终的程序中.本文将介绍Python程序员必知必会的开发者工具. 对于开发者来说,最实用的帮助莫过于帮助他们编写代码文档了.pydoc模块可以根据源代码中的docstrings为任何可导入模块生成格式良好的文档.Python包含了两个测试框架来自动测试代码以及验证代码的正确性:1)doctest模块,该模块可

《Oracle PL/SQL必知必会》——第2章 初识Oracle和PL/SQL 2.1 什么是Oracle

第2章 初识Oracle和PL/SQL Oracle PL/SQL必知必会 在本章中,你将认识Oracle和PL/SQL是什么,以及你可以使用什么工具来操作它们. 2.1 什么是Oracle 在前一章中,你学习了数据库和SQL.如所解释的那样,做所有工作(存储.检索.管理和操作数据)的实际上是数据库软件(DBMS或数据库管理系统[Database Management System]).Oracle DBMS(或者简称为Oracle)就是一个DBMS:也就是说,它是数据库软件. Oracle已经

《Oracle PL/SQL必知必会》导读

前言 Oracle PL/SQL必知必会 Oracle Database(或Oracle RDBMS)是如此流行并且获得了广泛的认可,以至于大多数用户将其简称为"Oracle"(忽略了Oracle公司制作其他软件甚至硬件的事实).Oracle Database(我将像大多数人那样将其简称为"Oracle",以使事情变得简单)从20世纪70年代起就出现了,成为最早的数据库管理系统之一.Oracle是世界上最常用的数据库管理系统(Database Management

【web必知必会】——图解HTTP(上)

原文:[web必知必会]--图解HTTP(上) 本篇总结关于http的相关知识,主要内容参考如下导图: 主要讲解的内容有: 1 URL与URI的区别. 2 请求报文与相应报文的内容. 3 GET与POST的区别. 4 http的cookie.持久化.管道化.多部分对象集合.范围请求等 后续会更新http其他的相关知识. 关键词概念 平时会经常接触到URL,他就是我们访问web的一个字符串地址,那么URI是什么呢?他们是什么关系呢? 先看看官方的解释: URL:uniform resource l

Android必知必会-使用Intent打开第三方应用及验证可用性

本文讲的是Android必知必会-使用Intent打开第三方应用及验证可用性,一个普通的应用默认会有一个入口 Activity,它在 AndroidManifest.xml 中一般这样写: <application>      <activity android:name=".MainActivity" >          <intent-filter>              <action android:name="andr