2.1引用的基本使用
作用:给变量起别名
语法:数据类型 &别名 = 原名
注意:引用必须引用一块合法的内存空间
示例
#include<iostream> using namespace std; //引用 int main() { int a = 10; int& b = a; cout << "a==" << a << endl; cout << "b==" << b << endl; b = 100; cout << "a==" << a << endl; cout << "b==" << b << endl; return 0; }
运行结果
2.2引用的注意事项
-
引用必须初始化
-
引用在初始化后就不能改变了
2.3引用做函数参数
作用:函数传参时,可以利用引用技术让形参修饰实参
优点:可以简化指针修改实参
函数传参的三种方式:
-
值传递
示例
//1、值传递 void mySwap01(int a,int b) { int temp = a; a = b; b = temp; } //引用 int main() { int a = 10; int b = 20; mySwap01(a, b);//值传递,形参不会影响实参 cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; }
运行结果
-
地址传递
*示例
#include<iostream> using namespace std; //2、地址传递 void mySwap01(int* a, int* b) { int temp = *a; *a = *b; *b = temp; } int main() { int a = 10; int b = 20; mySwap01(&a, &b);//值传递,形参不会影响实参 cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; }
运行结果
-
引用传递
示例
#include<iostream> using namespace std; //3、引用传递 void mySwap01(int& a, int& b) { int temp = a; a = b; b = temp; } //引用 int main() { int a = 10; int b = 20; mySwap01(a, b);//值传递,形参不会影响实参 cout << "a = " << a << endl; cout << "b = " << b << endl; return 0; }
运行结果
2.4 引用做函数返回值
作用: 引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
示例
#include<iostream> using namespace std; //返回局部变量引用 int& test01() { int a = 10;//局部变量存放在四区的栈区 return a; } int main() { //不要返回局部变量的引用 int& ref = test01(); cout << "ref = " << ref << endl;//第一次结果正确因为编译器做了保留 cout << "ref = " << ref << endl;//第二次结果错误,因为a的内存已经释放 return 0; }
运行结果
用法:函数调用作为左值
示例
#include<iostream> using namespace std; //函数的调用可以做为左值 int& test01() { static int a = 10;//静态变量,存放在全局区,全局区上的数据在程序结束后系统释放 return a; } int main() { int& ref = test01(); cout << "ref = " << ref << endl; cout << "ref = " << ref << endl; test01() = 1000; cout << "ref = " << ref << endl; cout << "ref = " << ref << endl; return 0; }
运行结果
2.5 引用的本质
本质:引用的本质在C++内部是现实一个指针的常量
在函数参数中发现是引用转换为 int * const ref = &a
在函数内部发现ref是引用转换为 *ref = 10
2.6 常量引用
作用:常量引用主要又来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参
示例
#include<iostream> using namespace std; //函数的调用可以做为左值 void test01(int& val) { val = 200; cout << "val = " << val << endl; } void test02(const int& val) { //val = 200;//不能修改 cout << "val = " << val << endl; } int main() { int a = 10; //引用必须引用一块合法的内存空间 //int& ref = 10; //加上const之后 编译器将代码修改为 int temp = 10;const int &ref = temp //const int& ref = 10; //加上const之后变为只读,不可以修改 //ref =20; test01(a); test02(a); cout << "没有const = " << a << endl; cout << "有const = " << a<< endl; return 0; }