1、先从下面这段代码的运行结果开始看起:
int a = 10; //在内存上开辟4个字节, a就代表这个4个字节内存
int *p = &a; //让一个指针 指向这个4个字节的空间
*p = 20;
cout << "a = " << a << endl;//20
int & b = a; //定义一个引用b 指向a, b此时就是变量的a的别名
b = 40;
cout << "a = " << a << endl;//40
cout << "b = " << b << endl;//40
cout << "&a = " << &a << endl;//0x7ffdb085b99c
cout << "&b =" << &b << endl;//0x7ffdb085b99c
//int & c; //只是单纯定义一个引用, 不初始化, 引用一定要初始化
int &bb = b; //对b引用再次 引用, 实际上是b的别名
cout << "bb = " << bb << endl;//40
2、下面开始总结:
2.1 引用类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地 址。
2.2 声明的时候必须初始化,一经声明,不可变更。
2.3 可对引用,再次引用。多次引用的结果,是某一变量具有多个别名。
2.4 &符号前有数据类型时,是引用。其它皆为取地址。
2.5 在研究引用的时候 ,可以将引用理解为 一个常指针,在理解引用的时候, 可以将引用理解为 一个变量的别名。
3、通过函数对比指针和引用:
3.1
void motifyAA(int *p) //int *p = &a;
{
*p = 100;
}
void motifyBB(int &r) //int &r = a;
{
r = 200;
}
3.2
void my_swap01(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void my_swap02(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
4、引用作为函数的返回值:
int getA1()
{
int a = 10;
return a;
} //value_a = a;
int &getA2()
{
int a = 10;
return a;
} //匿名的引用 int & = a; // int &temp = &a;
int &getBB()
{
static int b = 100;
return b;
}
int value_a = getA1(); //正确
int &r_a = getA2(); //禁止
int &r_b = getBB(); //此时的r_b 就是 getBB中的 static int b
说明:当函数返回引用时,返回的是变量的名称,而不是变量的值,所以如果返回的是函数内部的局部变量,就不可以用引用进行接收。就以getBB()为例,我们实际返回的是b,而不是100;因为我们可以进行如下操作:
getBB() = 3000; //static b = 3000;
5、const引用
const int a = 10; // a必须初始化
const int &b = a;
如果是一个const 常量, 必须用const 引用来接收它。