目录
引用的基本使用
引用的注意事项
引用做函数参数
引用做函数的返回值
引用的本质
引用的基本使用
作用:引用就是给变量起别名,它不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。我的理解就是在某些场景下它比指针好用。
语法:数据类型& 别名 = 原名;
#include<iostream>
using namespace std;int main()
{int a = 10; //定义各个整型变量int& b = a; //定义个引用cout << "a的值为:" << a << endl; // a的值为10cout << "b的值为:" << b << endl; // b的值为10system("pasue");return 0;
}
引用的注意事项
1、引用必须初始化
int &b; //这是不可以的
2、引用初始化后,就不可以更改
int a = 10;
int c = 20;
int& b = a;
int& b = c; //b引用了a之后,就不能再引用c 不可以再进行更改3、引用还可以继续有引用
int a = 10;
int& b = a;
int& c = b; //b引用了a, c引用了b4、一个变量可以有多个引用
int a = 10;
int& b = a;
int& c = a; //b c都引用了a5、可以对任何类型做引用
#include<iostream>
using namespace std;int main()
{int a = 10; //定义各个整型变量int &b = a; //必须初始化 ,此时 b 和 a 是相等的共享空间 相当于b就是a的别名(小名)int c = 20; //引用初始化后,不可以更改b = c; //这是复赋值操作,不是更改引用cout << "a的值为:" << a << endl; // a的值为20cout << "b的值为:" << b << endl; // b的值为20cout << "c的值为:" << c << endl; // b的值为20system("pasue");return 0;
}
引用的两大应用场景(做函数参数、做返回值)
引用的两大应用场景分别是1、做函数参数,2、做返回值
1、做函数参数
引用做函数的参数,作用相当于指针,可以改变变量本身,前面说形参不能修饰实参,但是用指针的时候可以修饰,但是利用指针来传参,还需要解引用,但是采用 引用来传参则不需要这么麻烦,因为传参传一个实参过去,接收时使用引用,此时该引用就是形参的别名,形参的别名改变会改变形参本身。
2、做返回值
用引用接收返回值时,不再需要开辟额外的空间来存函数返回值时产生的临时变量,在main()函数中将临时变量拷贝给接收值。对于像静态变量、全局变量等这些出了作用域不会销毁的对象,就可以使用 传引用返回 ,它不用拷贝,返回的直接就是返回变量的别名,这能够极大地提高效率(目前简单粗暴的理解)
作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参
#include<iostream>
using namespace std;//交换函数
int Swap01( int a,int b)
{int temp = a;a = b;b = temp;return 0;
} //1、值传递
int Swap02( int a,int b)
{int temp = a;a = b;b = temp;cout << "Swap02 a的值为:" << a << endl; // a的值为20cout << "Swap02 b的值为:" << b << endl; // b的值为10return 0;
}//2、地址传递
int Swap03( int *a,int *b)
{int temp = *a;*a = *b;*b = temp;cout << "Swap03 a的值为:" << a << endl; // a的值为20cout << "Swap03 b的值为:" << b << endl; // b的值为10return 0;
}//3、引用
int Swap04( int &a,int &b)
{int temp = a;a = b;b = temp;cout << "Swap04 a的值为:" << a << endl; // a的值为20cout << "Swap04 b的值为:" << b << endl; // b的值为10return 0;
}int main()
{int a = 10; int b = 20; Swap01(a,b); //值传递 形参不会修饰实参Swap03(&a,&b); //地址传递 形参会修饰实参Swap04(a,b); //引用传递 形参会修饰实参cout << "a的值为:" << a << endl; // a的值为10cout << "b的值为:" << b << endl; // b的值为20cout << "Swap03 a的值为:" << a << endl; // a的值为20cout << "Swap03 b的值为:" << b << endl; // b的值为10cout << "Swap04 a的值为:" << a << endl; // a的值为20cout << "Swap04 b的值为:" << b << endl; // b的值为10system("pasue");return 0;
}
引用做函数的返回值
#include<iostream>
using namespace std;//引用做函数的返回值
//1、不要返回局部变量的引用
int& test01() // int& 表示a最为一个引用返回
{int a = 10; //局部变量存放在四区中 栈区 执行完就释放掉了return a;
}//2、函数的调用可以作为左值
int& test02()
{static int a = 10;// 加 static 变为静态变量存放在四区中的全局区 执行完整个程序由系统释放掉了return a;}int main()
{int &ref1= test01();int &ref2= test02();cout << "ref1的值为:" << ref1 << endl; // ref1的值为20cout << "ref1的值为:" << ref1 << endl; // 出现错误乱码 因为局部变量 执行完这个代码 空间被释放掉了,第二次输出就会出现错误不一致情况test02()=1000; //作为左值(也就是左边的值)cout << "ref2的值为:" << ref2 << endl; // ref2的值为1000cout << "ref2的值为:" << ref2 << endl; // ref2的值为1000system("pasue");return 0;
}
引用的本质
本质:应用的本质在C++内部实现是一个指针常量
#include<iostream>
using namespace std;//发现是引用,转化为 int* const ref = &avoid test01(int& ref)
{ref = 10; //ref是引用,转化为*ref = 10}int main()
{int a = 100;//自动转为为int* const ref = &a,指针常量是指针指向不可改变,所以说为什么引用不可以更改int& ref= a;ref = 20; cout << "a:" << a << endl; cout << "ref:" << ref << endl; test01();system("pasue");return 0;
}
关于引用的知识点还没学完,先写到这,感兴趣的可以参考这篇文章C++ 引用(&)的超详细解析(小白必看系列)_c++ &-CSDN博客,虽然写的很详细,对我而言还是有有很多地方需要仔细研究才能懂。