文章目录
前言
C++中的引用
一、C++引用的基本语法
简要说明
- 作用:给变量起别名
- 语法:数据类型 &别名 = 原名;(别名与原名的数据类型要一致)
代码示例
#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;
system("pause");
return 0;
}
<运行结果如下>
二、C++引用的注意事项
简要说明
- 引用必须初始化
- 引用一旦初始化,就不可以更改了
代码示例
代码如下(示例):
#include <iostream>
using namespace std;
int main()
{
int a = 10;
//1、引用必须初始化
//int &b; 这是错误的,没有初始化
int &b = a;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << endl;
//2、引用后不能更改
int c = 20;
b = c; //赋值操作,而不是更改引用
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
system("pause");
return 0;
}
<运行结果如下>
三、引用做函数参数
简要说明
- 作用:函数传参时,可以利用引用的技术让形参修饰实参
- 优点:可以简化指针修饰实参
代码示例
ps: 顺便复习一下函数的传递方法
1、值传递
#include <iostream>
using namespace std;
void mySwap01(int m, int n)
{
cout << "m = " << m << endl;
cout << "n = " << n << endl;
cout << endl;
int temp;
temp = m;
m = n;
n = temp;
cout << "m = " << m << endl;
cout << "n = " << n << endl;
cout << endl;
}
int main()
{
int a, b;
a = 10;
b = 20;
mySwap01(a, b); //形参不能修饰实参,a和b的值没有交换
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
运行结果如下:
2、地址传递
#include <iostream>
using namespace std;
void mySwap02(int* m, int* n)
{
cout << "*m = " << *m << endl;
cout << "*n = " << *n << endl;
cout << endl;
int temp;
temp = *m;
*m = *n;
*n = temp;
cout << "*m = " << *m << endl;
cout << "*n = " << *n << endl;
cout << endl;
}
int main()
{
int a, b;
a = 10;
b = 20;
mySwap02(&a, &b); //形参能修饰实参
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
运行结果如下:
3、引用传递
#include <iostream>
using namespace std;
void mySwap03(int &m, int &n)
{
cout << "m = " << m << endl;
cout << "n = " << n << endl;
cout << endl;
int temp;
temp = m;
m = n;
n = temp;
cout << "m = " << m << endl;
cout << "n = " << n << endl;
cout << endl;
}
int main()
{
int a, b;
a = 10;
b = 20;
mySwap03(a, b); //形参能修饰实参
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
运行结果如下:
<ps: 原名和别名可以一样>
四、引用做函数返回值
简要说明
- 作用:引用是可以作为函数的返回值存在的
- 注意: 不要返回局部变量的引用
- 用法: 函数调用作为左值
代码示例
<栗子1>
#include <iostream>
using namespace std;
//1、不要返回局部变量的引用
int& test01()
{
int a = 10; //a为局部变量,存放在栈区
return a;
}
//2、函数的调用可以作为左值
//int& test02()
//{
// static int a = 10; //a为静态变量,存放在全局区
// return a;
//}
int main()
{
int& ref1 = test01();
cout << "ref1 = " << ref1 << endl;
cout << "ref1 = " << ref1 << endl;
/*int& ref2 = test02();
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
cout << endl;
test02() = 1000;
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;*/
system("pause");
return 0;
}
<运行结果如下>
第一次编译器做了保留,但从第二次开始就会出现乱码了。所以不能返回局部变量的引用。
<栗子2>
#include <iostream>
using namespace std;
1、不要返回局部变量的引用
//int& test01()
//{
// int a = 10; //a为局部变量,存放在栈区
// return a;
//}
//2、函数的调用可以作为左值
int& test02()
{
static int a = 10; //a为静态变量,存放在全局区
return a;
}
int main()
{
/*int& ref1 = test01();
cout << "ref1 = " << ref1 << endl;
cout << "ref1 = " << ref1 << endl;*/
int& ref2 = test02();
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
cout << endl;
test02() = 1000; //即a = 1000; 若函数的返回值是引用,则这个函数调用可以作为左值
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
system("pause");
return 0;
}
<运行结果如下>
五、引用的本质
简要说明
- 本质:引用的本质在C++内部实现是一个指针常量
- 指针常量:指针指向不变,指向的值可以改变
- 常量指针:常量值不变
代码示例
#include <iostream>
using namespace std;
//发现是指针,转化为 int* const ref = &a;
void func(int& ref)
{
ref = 100; //发现是引用,自动改为*ref = 100;
}
int main()
{
int a = 10;
int& ref = a;
//自动转换为 int* const ref = &a; 指针指向不可改,这也能说明为什么引用不可更改。
ref = 20;
//内部发现是引用,自动改为*ref = 20;
cout << "a = " << a << endl;
cout << "ref = " << ref << endl;
cout << endl;
func(a);
cout << "a = " << a << endl;
cout << "ref = " << ref << endl;
system("pause");
return 0;
}
<运行结果如下>
六、常量引用
简要说明
- 作用:常量引用主要用来修饰形参,防止误操作
- 在函数形参列表中,可以加const修饰形参,防止形参改变实参
代码示例
<栗子1>
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int& ref = 10; //这样初始化是不合法的
return 0;
}
那怎么改呢?
<栗子2>
#include <iostream>
using namespace std;
int main()
{
//int a = 10;
const int & ref = 10; //这样就没错了
//因为加上const之后,编译器将代码改为 int temp = 10; int& ref = temp;
cout << "ref = " << ref << endl;
system("pause");
return 0;
}
<运行结果如下>
<栗子3>
如果给ref重新赋值呢
如图所示,显然是不对的。因为加了const, 所以为只读,不能改变ref的值
<栗子4>
#include <iostream>
using namespace std;
//打印数据函数
void showValue(const int& value) //因为加了const,所以value为只读,
{ //不能更改value的值,以此来防止数据被改
//value = 1000; //->这一步是不对的
cout << "value = " << value << endl;
}
int main()
{
int a = 100;
showValue(a);
system("pause");
return 0;
}
总结
- C++推荐用引用技术,因为语法方便,引用的本质是指针常量,但是所有的指针操作编译器帮我们做了。
- 在常量引用中,总的来说,利用const修饰形参,以防止实参数据被改