什么是引用?
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,
它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋
⻛";林冲,外号豹⼦头;
语法格式:类型&引⽤别名=引⽤对象;
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
cout << b << endl;
return 0;
}
引用的特性
引⽤在定义时必须初始化
⼀个变量可以有多个引⽤
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
int& c = b;
int& d = c;
cout << a << endl;
cout << b << endl;
cout << c << endl;
cout << d<< endl;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}
引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
#include<iostream>
using namespace std;
int main()
{
int a = 10;
int& b = a;
int c = 20;
// 这⾥并⾮让b引⽤c,因为C++引⽤不能改变指向,
// 这⾥是⼀个赋值
b = c;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
return 0;
}
引用的使用
引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。
例如交换两个变量的值:
#include<iostream>
using namespace std;
void Swap(int& rx, int& ry)
{
int tmp = rx;
rx = ry;
ry = tmp;
}
int main()
{
int x = 0, y = 1;
cout << x << " " << y << endl;
Swap(x, y);
cout << x << " " << y << endl;
return 0;
}
const引用
可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访问权限在引⽤过程中可以缩⼩,但是不能放⼤。
不过需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d;
这样⼀些场景下a*3
的和结果保存在⼀个临时对象中, int& rd = d
也是类似,在类型转换中会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。
所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,
C++中把这个未命名对象叫做临时对象
int main()
{
const int a = 10;
// 编译报错:error C2440: “初始化”: ⽆法从“const int”转换为“int &”
// 这⾥的引⽤是对a访问权限的放⼤
//权限可以缩小,但不能放大,const修饰了变量a,那么a只能读不可写
//错误
//int& ra = a;
// 这样才可以
const int& ra = a;
// 编译报错:error C3892: “ra”: 不能给常量赋值
//ra++;
// 这⾥的引⽤是对b访问权限的缩⼩
int b = 20;
const int& rb = b;
// 编译报错:error C3892: “rb”: 不能给常量赋值
//rb++;
//这里是给rb加上了const,但是不会影响b
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a = 10;
const int& ra = 30;
// 编译报错: “初始化”: ⽆法从“int”转换为“int &”
// int& rb = a * 3;
const int& rb = a*3;
double d = 12.34;
// 编译报错:“初始化”: ⽆法从“double”转换为“int &”
//类型转换产生临时对象,C++规定临时对象具有常性,要用const修饰
// int& rd = d;
const int& rd = d;
return 0;
}
指针和引⽤的关系
1.sizeof的区别,指针无论是什么类型,计算出都是4个字节(32位平台)或者8个字节(64位平台),而引用和数据的类型关联,字节大小取决于引用的数据类型
2.语法上:指针是一个存储变量的地址,指针需要开空间,但引用只是取别名不开空间
3.引用必须初始化,而指针不必非要初始化,前者强制要求,后者没有
4.引用在初始化引用了一个对象后就不能再引用其他对象了,但是指针可以不断地改变指向对象
5.指针需要解引用才能访问对象,但引用可以直接访问
6.指针很容易出现空指针和野指针的问题,但引用很少,相对来说比较安全。但不是绝对安全,也存在野引用的问题例如: