C++学习(6)—— 引用
1. 引用的基本使用
作用:给变量起别名
语法:数据类型 &别名 = 原名
#include<iostream>
using namespace std;
int main(){
int a = 10;
int &b = a;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
b = 20;
cout << "b=" << b << endl;
return 0;
}
2. 引用的注意事项
- 引用必须初始化
int &b;
是错误的
- 引用一旦初始化,就不可以更改了
3. 引用做函数参数
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
#include<iostream>
using namespace std;
//交换函数
//1.值传递
void mySwap01(int a,int b){
int temp = a;
a = b;
b = temp;
}
//2.地址传递
void mySwap02(int *a,int *b){
int *temp = *a;
*a = *b;
*b = *temp;
}
//3.引用传递
void mySwap03(int &a,int &b){
int temp = a;
a = b;
b temp;
}
int main(){
int a = 10;
int b = 20;
mySwap01(a,b); //值传递,形参不会修饰实参
mySwap02(&a,&b); //地址传递,形参会修饰实参
mySwap03(a,b); //引用传递,形参会修饰实参
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
4. 引用做函数的返回值
作用:引用是可以作为函数的返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值
#include<iostream>
using namespace std;
//引用做函数的返回值
//1.不要返回局部变量的使用
int& test01() {
int a = 10; //局部变量存放在四区中的栈区
return a;
}
//2.函数的调用可以作为左值
int& test02() {
static int a = 10; //静态变量存放在全局区,全局区的数据在程序结束后系统释放
return a;
}
int main() {
int &ref = test01();
cout << "ref=" << ref << endl;
cout << "ref=" << ref << endl;
int &ref2 = test02();
cout << "ref=" << ref2 << endl;
cout << "ref=" << ref2 << endl;
test02() = 1000;
cout << "ref=" << ref2 << endl;
cout << "ref=" << ref2 << endl;
system("pause");
return 0;
}
5. 引用的本质
本质:引用的本质在C++内部的实现是一个指针常量
//发现是引用,转换为int* const ref = &a;
void func(int& ref){
ref = 100; //ref是引用,自动帮转换为:*ref = 10
}
int main(){
int a = 10;
//自动转换为 int* const ref = &a;指针常量是指针指向不可改,也说明为什么引用不可改
int& ref = a;
ref = 20; //内部发现ref是引用,自动帮我们转换为:*ref = 10
cout << "a:" << a << endl;
cout << "ref:" << ref << endl;
func(a);
return 0;
}
6. 常量引用
作用:常量引用主要用来修饰形参,防止误操作
#include<iostream>
using namespace std;
//打印数据函数
void showValue(const int &val) {
//val = 1000;
cout << "val = " << val << endl;
}
int main() {
//常量引用
//使用场景:用来修饰形参,防止误操作
int a = 10;
//加上const之后,编译器将代码修改 int temp=10;const int& ref=temp;
//int & ref = 10; 非法
//const int & ref = 10;
showValue(a);
cout << "a = " << a << endl;
system("pause");
return 0;
}
Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.