目录
1. 引用基础语法
2. 引用可以作为函数参数,函数传参时,可以用引用的技术让形参修饰实参。
3. 引用做函数的返回值
4. 引用的本质
5. 常量引用
语法:数据类型 &别名 = 原名
注意事项:1. 引用必须要初始化
2.引用一旦初始化后便不可更改
优点:可以简化用指针来修改实参。
#include <iostream> using namespace std; // 正常函数 void MySwap1(int a, int b) { int temp = a; a = b; b = temp; } //指针 void MySwap2(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } //引用 void MySwap3(int &a, int &b) { int temp = a; a = b; b = temp; } int main() { int a = 10; int b = 20; MySwap1(a,b)//实参 a,b不变 cout << "a = " << a << "b = " << b << endl;//a = 10, b = 20 MySwap2(&a,&b)//实参 a,b的值互换了 cout << "a = " << a << "b = " << b << endl;//a = 20, b = 10 MySwap3(a,b)//实参 a,b的值互换了 cout << "a = " << a << "b = " << b << endl;//a = 20, b = 10 return 0; }
从上述代码可以看出,函数MySwap3和函数MySwap2两个函数执行的结果一样,MySwap2使用的是指针来实现形参修改实参,MySwap3使用引用的方式来实现用参修改实参。从代码的角度来看,使用MySwap3从定义到调用都要比函数MySwap2简洁,所以在实现中可以使用引用技术来让形参修改实参。
需注意两点:
a. 不要返回局部变量的引用
b. 函数的调用可以作为左值
#include <iostream> using namespace std; int &test1() { int a = 20; return a; } int &test2() { static int a = 20; return a; } int main() { //a. 不要返回局部变量的引用 int &ref1 = test1(); cout << "ref1 = " << ref1 << endl; //可以正确输出20 cout << "ref1 = " << ref1 << endl; //输出乱码 int &ref2 = test2(); cout << "ref2 = " << ref2 << endl; //可以正确输出20 cout << "ref2 = " << ref2 << endl; //可以正确输出20 //b. 函数的调用可以作为左值 test2() = 1000; int &ref3 = test2(); cout << "ref3 = " << ref3 << endl; //可以正确输出,但此时值为1000 return 0; }
引用的本质是在c++内部实现一个指针常量(指针的指向不可改变,值可以改变)。
#include <iostream> using namespace std; int main() { int a = 10; int &ref = a; //此时在c++内部会将其转换为:int *const ref = &a //指针常量是指针的指向不可以更改,这也说明为什么引用不可以更改 return 0; }
作用:常量引用主要用来修饰形参,防止误操作
做法:在函数的形参列表中,可以加入const修饰形参,防止形参改变实参数。
#include <iostream> using namespace std; int main() { int a = 10; int &ref = a;//正确 int &ref = 10; //不正确,必须引用一块合法d的内存空间 const int &ref = 10;//正确 //加上const之后,编译器将代码修改为: //int temp = 10; const int &ref = temp; ref = 20;//错误,加入const 之后 变为只读不可修改。 return 0; }
using namespace std; void ShowValue1(int &val) { val = 1000; cout << " val = " << val << endl; } void ShowValue2(const int &val)// 加入const 防止值在此函数内被改变 { val = 1000; //加入const之后,这行代码会报错 cout << " val = " << val << endl; } int main() { int a = 100; ShowValue2(a);//此时输出的是val = 100 cout << " a = " << a << endl;//此时输出的是a = 100 ShowValue1(a);//此时输出的是val = 1000 cout << " a = " << a << endl;//此时输出的是a = 1000 return 0; }