内容纲要
引用
引用的基本使用
作用:给变量起别名。
语法:数据类型 &别名 = 原名
#include <iostream>
using namespace std;
void main()
{
//引用的基本语法
int a = 10;
//数据类型 &别名 = 原名;
//创建引用
int& b = a;
cout << "a = " << a << endl;
cout << "&b = " << b << endl;
b = 100;
cout << "修改后 a = " << a << endl;//100
cout << "修改后 &b = " << b << endl;//100
}
引用的注意事项
- 引用需要初始化。
int &b; //错误的
- 引用一旦初始化后就不能更改。(区别于指针)
引用做函数参数
作用:函数传参时,可以利用引用的技术让参数修饰实参
优点:可以简化指针修饰实参
#include<iostream>
using namespace std;
//交换函数
//1.值传递
void swap01(int a , int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
//2.地址传递
void swap02(int* a,int* b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
cout << "值传递之后交换后的a的值:" << *a << endl;
cout << "值传递之后交换后的b的值:" << *b << endl;
}
//3.引用传递
void swap03(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void main()
{
int a = 10;
int b = 20;
swap03(a, b);
cout << "值传递之后交换后原函数的a的值:" << a << endl;
cout << "值传递之后交换后原函数的b的值:" << b << endl;
system("pause");
}
引用做函数的返回值
- 不要返回局部变量引用
- 函数调用可以作为左值
#include <iostream>
using namespace std;
// 引用做函数的返回值
//1、不要把引用做局部变量的返回值。
int& test01()
{
int a = 10;
return a;
}
//2、函数的调用可以作为左值
int& test02()
{
static int a = 10;
return a;
}
void main()
{
int &b = test01();
cout << "接收到的地址&a = " << b << endl; //第一次正确接收。因为编译器对返回的值做了一次保留
cout << "接收到的地址&a = " << b << endl; //非法访问内存。,第二次结果乱码,因为返回的地址已经丢了。
int &c = test02();
cout << "接收到的地址&c = " << c << endl;
cout << "接收到的地址&c = " << c << endl;
test02() = 1000; //函数的调用作为左值!!!!!
cout << "接收到的地址&c = " << c << endl;
cout << "接收到的地址&c = " << c << endl;
system("pause");
}
引用的本质
本质:引用的本质在c++ 内部实现是一个指针常量。
引用必须初始化。且初始化之后不能修改指向。
常量引用
作用:常量引用主要用来修饰形参,防止误操作。
在函数形参列表中,可以加 const
来修饰形参,防止形参比改变实参。
使用场景:如下,int &value 作为形参 的时候可以修改传入的值,因此为了误操作可以添加const 使其变为只读。
#include <iostream>
using namespace std;
void showValue(int &value) {
value = 1000;
cout << "value 的值为:" << value << endl;
}
void main()
{
//常量引用
//使用场景:用来修饰形参,防止误操作。
int a = 10;
showValue(a);
cout << "main函数中a 的值为:" << a << endl;
system("pause");
}
将showValue() 函数形参改为常量引用(如果函数中误操作,编译器会帮你报错)
void showValue(const int &value) {
//value = 1000;
cout << "value 的值为:" << value << endl;
}