1、引用的概念和定义
引用不是新定义一个变量,而是给已经存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用一块内存空间。比如,西游记中“齐天大圣”,“弼马温”指的都是孙悟空。
类型& 引⽤别名 = 引⽤对象;
代码示例:
#include<iostream>
using namespace std;
int main()
{
int a = 0;
/ 引⽤:b和c是a的别名
int& b = a;
int& c = a;
/ 也可以给别名b取别名,d相当于还是a的别名
int& d = b;
++d;
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}
由图中可知,d改变后a,b,c也改变了。
2、引用的特性
(1)引用在定义时必须初始化
如:
void test()
{
int& p; /该语句编译时会出错
}
(2) 一个变量可以有多个引用
如:
void test()
{
int a=10;
int& p=a;
int& pp=a;
}
(3) 引用一旦引用了一个实体,再不能引用其他实体
如:
void test()
{
int a=0;
int b=1;
int&p=a;
p=b; /p再次引用其他实体,报错;
}
3、const引用
3.1 const引用的引用对象
可以引⽤⼀个const对象,但是必须⽤const引⽤。const引⽤也可以引⽤普通对象,因为对象的访
问权限在引⽤过程中可以缩⼩,但是不能放⼤。
如:
void test()
{
int a=0;
const int& p=a;
/此时p不能够再修改其内容(a的值)
const int b=1;
const int& s=b; /const 引用可以引用const对象
/但是不能使对象的访问权限扩大:
int& ss=b; /会报错
}
3.2 对临时对象的引用
临时对象: 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象
类似 int& rb = a3; double d = 12.34; int& rd = d; 这样⼀些场景下a3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。
如:
#include<iostream>
using namespace std;
int main()
{
int a = 10;
const int& ra = 30;
int& rb = a * 3; /错误示例
const int& rb = a*3; /正确写法
double d = 12.34;
int& rd = d;/错误示例
const int& rd = d; /正确写法
return 0;
}
4、指针与引用的关系
C++中指针和引⽤在实践中他们相辅相成,功能有重叠性,但是各有⾃⼰的特点,互相不可替代。
(1).语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
(2).引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
(3).引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
(4).引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
(5).sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下
占4个字节,64位下是8byte)
(6).指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些