C++引用

引用形式

C++中的引用形式如下:

int a=0;
int & ra=a;

即:类型名 & 引用名 = 引用的变量;

这里就定义了一个变量a的一个引用ra。对ra进行的任何操作都与对a做的任何操作所等价。相当于ra是a的别名。如:

ra = 100;
cout<<a<<endl;
>>>100

注意事项

  1. 引用必须初始化,即定义引用时必须指明引用的变量。不初始化会报错:
int & ra;
>>>[Error] 'ra' declared as reference but not initialized
  1. 引用不能更改所引用的对象。如:
int a = 0;
int b = 10;
int & ra = a;
int & ra = b;
>>>[Error] redeclaration.重复声明
& ra =b;
>>>[Error] lvalue required as left operand of assignment.等号左边应为变量而非表达式,编译器认为此处的&是取址符
ra = b;  //正确,但这个是赋值操作
  1. 显然,int & ra =a;中的&只是一种标识符,而非取址符。
  2. 引用对象只能是变量,不能是常量。也就是说,只能通过变量初始化引用。如:
const int a = 0;
int & ra = a;
>>>[Error] invalid initialization of reference of type 'int&' from expression of type 'const int'

引用与指针

通过上述描述,可以看出,引用与指针似乎具有很多相似之处。通过引用可以对所引用的变量直接进行操作,通过指针同样可以达到该目的。

再分析引用与指针的关系前,我们先搞清楚“常量指针”与“指针常量”这两个概念。

常量指针与指针常量

这是一个看着就很晕的东西,但其实应该是英译中过程中出现的问题。而且不同的地方有时翻译的刚好相反。这里采用最大众的一种。

我们知道,C\C++中的常量是通过const关键字定义的,指针是通过类型名 * 指针名定义的。将二者结合,就会出现一下几种:

const int a;
int const a;
int * p;
const int *p;
int cosnt *p;
int * const p;
const int * const p;
int const * const p;

我们按顺序讲起。

  1. const int a;int const a;都是通过const定义的int类型常量,无法修改其值。
  2. int *p;是一个指向int类型变量的指针,可以通过*p改变所指变量的值,也可以指向别处。
  3. const int *p;int const *p;相同,都是常量指针。可以指向intconst int等数据类型。常量指针const修饰的是指针p所指内容。就是说,指针p可以指向别处,所指变量若不是const也可以通过直接赋值改变其值,不可以通过常量指针改变所指变量的值。如:
int a = 0;
int A = 0;
const int * p = &a;
p = &A;  //常量指针可以指向别处
a = 100;  //a是常量指针所指的int类型变量,可以赋值
*p = 100;  //[Error] assignment of read-only location '* p'. 不能通过常量指针改变其所指变量
  1. int * const p;是一个指针常量。可以通过指针常量对所指变量进行赋值,不能使指针常量指向其他变量。如:
int a = 0;
int A = 0;  
int * const p = &a;
p = &A;  //[Error] assignment of read-only variable 'p'. 指针常量不能指向其他位置
a = 100;  //a可以赋值改变
*p = 100;  //可以通过指针常量改变其所指变量
  1. const int * const p;int const * const p;相同,都是指向常量的指针常量。他们只能指向const int类型,不能指向int类型。既不能通过指针改变所指常量值,也不能使指针指向其他变量。可谓双重read-only。

引用的指针实现

在弄清楚常量指针与指针常量后,我们对应着引用的特点,可以发现——引用就是一种指针常量。

对比如下两段代码:
先不对比了,明天再写,先发了充数。下面也是,明天再写。

常引用

数组引用

应用实例

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 因为最近在用C++写项目,因为之前C++的基础为0,所以对引用的理解非常浅显,一直将其当作指针来看待,然而现...
    蟹蟹宁阅读 592评论 0 4
  • 以下为代码运行环境: 环境版本OSmacOS Mojave version10.14.6cmake3.15.3vs...
    hula_hola阅读 234评论 0 0
  • 原文地址:https://www.cnblogs.com/jycboy/p/5184638.html 一、变量的引...
    Caiaolun阅读 3,552评论 1 0
  • 引用的简单用法 number 即为 amount的引用,可以认为是amount的别名,引用的本质和指针一样,都是地...
    cabin523阅读 337评论 0 0
  • 引用是支持运算符重载语法的基础,也为函数的传入和传出控制提供了便利。 拷贝构造函数,是一种特殊的构造函数,需要用引...
    zjunchao阅读 437评论 0 1

友情链接更多精彩内容