基本概念
定义: 引用不是新定义一个变量,而是给已存在的变量取一个别名,编译器不会为引用变量开辟内存空间,引用实体和引用变量共用同一块内存空间。
用法: 引用类型& 引用变量 = 引用实体;
引用的特点
- 一个变量可以有多个引用
- 引用实体和引用类型必须为同种类型
- 引用在定义时必须初始化并且不能被初始化为NULL
- 不可以改变引用关系,引用一旦引用了一个实体,就不能再引用其他实体
引用的用法
const与引用
被 const 修饰的变量它的引用变量也要被 const 修饰。
#include <iostream>
using namespace std;
int main()
{
const int a = 1;
// int& b = a; // 报错
const int& b = a; // 表示不可以通过b来修改a
return 0;
}
参数与引用
引用作为参数时的原因:
- 在函数内部会对此参数进行修改
- 提高函数调用和运行效率
函数调用时,值的传递机制是通过 “形参 = 实参” 来对形参赋值达到传达目的,产生了一个实参的副本。
而引用不用经过值的传递机制,已经有了实参值的信息。所以没有了传值和生成副本的时间和空间消耗。当程序对效率要求较高时,这是非常必要的。
#include <iostream>
using namespace std;
void swap(int& a, int& b)
{
int c = a;
a = b;
b = c;
}
int main()
{
int a = 1, b = 2;
swap(a, b);
cout << a << ' ' << b << endl;
return 0;
}
返回值与引用
返回值为引用的好处:在内存中不产生被返回值的副本
#include <iostream>
using namespace std;
int& fun(int a)
{
a += 2;
return a;
}
int main()
{
int a = 3, b = fun(a);
cout << a << ' ' << b << endl;
return 0;
}
引用与指针的区别
- 引用在定义时必须被初始化并且不能被初始化为NULL,指针没有要求
- 引用不能改变引用关系,指针可以
- 有多级指针没有多级引用
- 引用++和指针++表达的含义不同。指针自增是指针上的计算,引用自增单纯加1
- 指针用 sizeof 计算大小结果不同,指针在32位内存下是4字节,在64位内存下是8字节,引用结果为类型大小
- 指针是一个实体,需要分配内存空间;引用只是变量的别名,不需要分配内存空间
引用的优势
使用指针作为函数的参数也可以达到引用同样的效果,但是在被调函数中同样要给形参分配存储单元,在这个意义上说,引用的效率更高。而且频繁使用 “指针变量名” 的形式进行运算容易产生错误而且可阅读性较差。