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
2、下面开始总结:
2.1 引用类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2.2 声明的时候必须初始化,一经声明,不可变更。(int & c,像这样不初始化是错的)
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、返回引用和返回变量的区别:
int& test()
{
return m_data_;
}
int test()
{
return m_data_;
}
int& a = test();
结论就是:
1 返回值为引用型(int& )的时候,返回的是地址。返回值不是引用型(int)的时候,返回的是一个数值。
编译器会先把这个数值放入一个内存中,再把这个地址付给a,此时的a代表的地址和 m_data_代表的地址是不一样。
2 不要在返回值为引用的函数中返回局部变量,因为当函数结束时,临时对象将消失,因此这种引用是非法的,在这种情况下,应返回对象。
6、const引用
const int a = 10; // a必须初始化
const int &b = a;
如果是一个const 常量, 必须用const 引用来接收它。