原文链接
引用是什么
引用不是重新定义一个变量,而是给一个已经存在的变量取的别名。
语法:类型& 引用变量名=已定义的变量名
引用的特点:
1、一个变量可以有多个别名。
2、引用必须初始化。
3、引用只能在初始化的时候使用一次,不能在作为其它变量的别名。
引用注意事项:
1.引用必须被初始化;
2.引用一旦与初始值对象绑定,就不会变化(引用从一而终)!!!
3.引用初始值必须为一个对象,不能使常数
4.引用必须与被引用的对象类型一致
重点:作用在引用上的所有操作事实上都是作用在该引用所绑定的对象上。
使用引用有何优点?
在传参的时候,使用指针传参,编译器需要给指针另行分配存储单元,存储一个该指针的副本,在函数中对这个副本进行操作;而使用引用传参,编译器就不需要分配存储空间和保存副本了,函数将直接对实参进行操作。所以使用引用使得程序的运行速度更快,执行效率更高。
我们可以看出别名和本来的变量指向同一块空间,是否引用变量的改变会引起原有变量的改变?
const引用
#include<iostream>
using namespace std;
void test(){
int a = 4;
const int& b = a;
a = 10; //a改变b也会随之改变
//b = 12; //常量不可以赋值
const int c = 3;
const int& d = c;
//int& e = d; //类型不匹配
const int& e = d;//常量具有常性,只有const修饰的引用才能引用常量
double f = 1.1;
//int& g = f;
const int& g = f;
//double 无法转为int& ,
//f在赋值时候会生成一个临时变量,临时变量具有常性,所以不能赋值
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
引用做参数
以Swap函数为例,比较值传递、址传递,引用传递。
#include<iostream>
using namespace std;
//值传递,无法实现交换两值的效果
void Swap1(int a, int b){
int tmp = a;
a = b;
b = tmp;
}
//址传递
void Swap2(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
//传引用
void Swap3(int& a, int& b){
int tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 10;
int b = 20;
int& c = a;
int& d = b;
Swap1(a, b);// 10 20
cout << a;
cout << b << endl;
Swap3(c, d);//20 10
cout << a;
cout << b << endl;
Swap2(&a, &b);//10 20此处是将上次交换后的20 10再次交换
cout << a;
cout << b << endl;
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
所以说在传参这一块引用和指针一样可以避免传值,形参是实参的临时拷贝,所以形参改变不会影响到实参。
….总结:传参传结构体时要避免直接传结构体,因为一旦结构体存在数组时,会先开好等大的空间然后一步步将数据拷进去,这样就会很低效。
引用做返回值
#include<iostream>
using namespace std;
//传值做返回值
int Add(int a, int b){
int ret = a + b;
return ret;
}
int& Add1(int a, int b){
int ret = a + b;
return ret;
}
void test(){
int a = 6;
int b = 4;
int c = Add(a, b);
int d = Add1(a, b);
}
int main()
{
test();
system("pause");
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
…….结论:
1、不要返回一个临时变量的引用。
2、如果返回对象出了作用域仍然存在,尽量使用引用作为返回值,会更加高效。
指针和引用的区别与联系:
1、引用只能在定义时初始化一次,之后不可以改变指向其他变量;指针变量的值可变。
2、引用必须指向有效的变量,指针可以为NULL。
3、sizeof(引用)得到所指向变量的大小,sizeof(指针)得到指向变量的地址的大小
4、指针++,加的是所指向类型的大小,引用++加的是1,加在变量上。
5、指针会有野指针的风险,所以引用相较于指针更加安全。