C++ 引用
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。
C++ 引用 vs 指针
引用很容易与指针混淆,它们之间有三个主要的不同:
- 不存在空引用。引用必须连接到一块合法的内存。
- 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
- 引用必须在创建时被初始化。指针可以在任何时间被初始化。
C++ 中创建引用
试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。例如:
int i = 17;
我们可以为 i 声明引用变量,如下所示:
int& r = i; double& s = d;
在这些声明中,& 读作引用。因此,第一个声明可以读作 "r 是一个初始化为 i 的整型引用",第二个声明可以读作 "s 是一个初始化为 d 的 double 型引用"。下面的实例使用了 int 和 double 引用:
实例
#include <iostream>
using namespace std;
int main ()
{
// 声明简单的变量
int i;
double d;
// 声明引用变量
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Value of i : 5 Value of i reference : 5 Value of d : 11.7 Value of d reference : 11.7
引用通常用于函数参数列表和函数返回值。下面列出了 C++ 程序员必须清楚的两个与 C++ 引用相关的重要概念:
概念 | 描述 |
---|---|
把引用作为参数 | C++ 支持把引用作为参数传给函数,这比传一般的参数更安全。 |
把引用作为返回值 | 可以从 C++ 函数中返回引用,就像返回其他数据类型一样。 |
Jailman
xma***man.com
int& r = i; 和 int r = i; 不同之处应该是内存的分配吧,后者会再开辟一个内存空间
输出结果:
Jailman
xma***man.com
小马
129***2060@qq.com
1.引用必须在声明时将其初始化,不能先声明后赋值。
上述代码编译时会报以下错误:
错误:'rodents' 声明为引用但未初始化。
2.引用更接近const指针,必须在创建时进行初始化,一旦引用和某个变量关联起来,该引用就会一直指向该变量。
上面代码实际上是下述代码的伪装表示:
例子:
输出结果:
从结果可以看出,虽然在调用 rodent = bunnies; 后引用 rosent 的值变为 50,但是 rosent 所指向的地址空间还是指向了 rats,没有发生改变,说明 rodent = bunnies; 只是将 bunnies 的值赋值给引用 rodent 所指向的变量,没有改变引用的指向。
小马
129***2060@qq.com
月色真美
132***6997@qq.com
我来给大家分享一下我对引用的理解:假如你被你的同学起了绰号叫"舞法少女",那么这个绰号就相当于你名字的一个引用,在同学看来,无论叫哪个都是在叫你。
除此之外,若在函数中使用引用作为参数,如下实例:将 a 当实参传给函数 func,x 为函数 func 的形参且为引用,在函数 func 中 x 被赋予了新的值 3,于是 a 的值也跟着变为 3。
月色真美
132***6997@qq.com
胡椒酱
fen***anghu026@gmail.com
在这里也只是想着验证一下 引用是否可以改变这个原来的被引用变量里存的值,最后也确实是可以改变。
用火影忍者里的分身法作比喻:
胡椒酱
fen***anghu026@gmail.com
JueVenil
452***845@qq.com
数组的引用一定要表明数组的大小。
JueVenil
452***845@qq.com
嘟嘟小猪
409***990@qq.com
B 引用 A:相当于 B 借用了 A 的内存地址和值,A 和 B 任意一个发生改变的话 AB 同时改变。
指针 B 指向 A:B 借用了 A 的值,但是B的内存地址重新分配,不同于 A。
输出结果为:
嘟嘟小猪
409***990@qq.com
TooHandsomeException
ywt***@163.com
C++11 新增特性 -- 右值引用,写法示例:
加入右值引用的目的主要是为了解决这样一个问题:在函数传值以及返回值的时候,一个对象被复制给另外一个对象,然后这个对象紧接着就被析构了。显然很浪费时间。使用右值引用的话就可以把一个对象的所有权“转让”给另外一个对象,而无需调用复制构造函数和析构函数。
TooHandsomeException
ywt***@163.com