前言
引用和指针的区别,是我在找工作过程中遇到最多的问题之一。其实也不难理解,引用其实也是一种指针,称之为隐式指针。继指针之后,我下面会对引用进行介绍,彻底干掉这个问题。
认识引用
引用的定义
引用是一种隐式指针,为对象取一个新名字,通过&操作符号来实现。如:
int a = 10;
int& b = a;
这里面,b就是a的引用。对b执行的操作和对a执行操作得到的效果一模一样。
引用的使用说明
引用是一个变量的别名,对引用的操作和对其引用对象的操作具有相同的作用效果。
一个引用只能对应一个变量。
使用引用必须要初始化,不然会报错。
引用的本质其实是一个指针常量,int& b 和 int* const b是一个作用,为什么这么说呢?首先看指针常量的特点,前面已经说过指针常量指向的地址不可以修改,但是所指向地址的内容可以修改。引用也有这样的特点,引用b作为对应对象a的别名,我们修改引用b的值的时候,a的值也会改变,但是地址不变。看例子:
#include<iostream>
using namespace std;
void main()
{
int a = 10;
cout << "a赋值之前得到的a= " << a << endl;
cout << "a赋值之前得到的a的地址= " << &a << endl;
int& b = a;
b = 100;
cout << "a赋值给引用b之后得到的a=" << a << endl;
cout << "a赋值给引用b之后得到的a的地址= " << &a << endl;
cout << "a赋值给引用b之后得到的b=" << b << endl;
cout << "a赋值给引用b之后得到的b的地址= " << &b << endl;
}
运行结果是这样的:
从结果我们可以看出来,a和b的地址没有变化,但是其指向的值发生了改变。
但是引用和指针还是有区别的,指针是一种数据类型,而引用不是;还有就是用法上,指针变量的用法复杂,而引用变量在被定义之后,它的使用方法和普通的变量是一样的。
右值引用
上文中提到的引用被默认为左值引用,那么什么是右值引用呢?
右值引用是C++11中新增加的非常量引用类型,形式如下:
数据类型 && 引用名称 = 被引用的对象;
来看一个例子,
void main()
{
int a = 10;
int&& b = a; //报错
cout << "b的值:" << b << endl;
}
为什么会不行呢,我明明按照那个形式写的呀?其实仔细想想,如果int && b=a不报错,那么一个&和两个&岂不是就没有区别了嘛。所以左值引用和右值引用绝对不同,不同就在于右值引用是对临时变量的引用,比如函数的返回值,并且所引用的临时变量不可以被改变。在右值引用初始化之后,临时变量消失。举个例子:
#include <iostream>
using namespace std;
int test()
{
int a = 10;
return a;
}
void main()
{
int a = 10;
int&& b = test();
//int& b = test();//报错
//int&& b = ++(test());//报错
cout << "b的值:" << b << endl;
}
第一个报错语句说明左右值引用的不同,第二个报错语句表示右值的临时变量不可改变。运行结果是:b的值:10
引用的初步认识先写到这里,下一篇会对引用在传参方面的使用及优势进行介绍。