引用相关知识,普通引用,常引用,引用作为参数,引用作为返回值等等
引用概念:引用不是新定义一个变量,而是给以存在的变量取了一个别名,编译器不会为引用变量开辟内存空间,引用和它所引用的变量共用同一块内存空间。
引用的特性:1.引用在定义时必须初始化
2.一个变量可以有多个引用
3.引用一旦绑定了一个实体,就不能再成为其他变量的引用
如图即可知道abcd表示同一块空间
以上介绍的是普通引用接下来我们看一下
常引用,即const引用
如图所示是错误的引用,因为a被const修饰,不能被改但是如果用普通引用c就有可能改变a的值因此报错,如何能避免这种错误呢?
给int 前面加上const。即刻改正//表明c只能读a,但是没办法改a
接下来继续看一个例子:
如何实现两个数交换,我们没学引用之前,肯定会用如下方法:指针
{
int tmp = *a;
*a = *b;
*b = tmp;
}
{
int a = 10;
int b = 20;
Swap(&a, &b);
cout << a << endl;
cout << b << endl;
system("pause");
}
{
int tmp = a;
a = b;
b = tmp;
}
{
int a = 10;
int b = 20;
Swap(a, b);
cout << a << endl;
cout << b << endl;
system("pause");
}
总结: 如果返回值是引用,返回的其实是ret别名
如果返回值不是引用,返回的是临时变量,寄存器值。
也就是说如果要返回引用,返回值生命周期应该大于Add函数。不然就非法访问。
继续思考:如何让函数返回值的函数周期大于函数本身,static修饰的静态变量
本篇主要讲解:普通引用 常引用
1.引用作为函数参数 优点:1.提高效率(比如后面博客提到的,每次通过值传递的方式,给函数传递一个对象时,都会调用拷 贝 构造, 然后继续调用析构函数,内存开销是非常大的)因此用引用可以提高效率。
2. 可以在函数内部,改变外部实参的值
2.作为返回值
3.当不希望函数内改变参数x的值时,尽量使用常引用传参