
软件为visual studio2017,内容为C++学习笔记,以及相关的问题处理方法,目的是方便回顾和复习。
笔记来自于:黑马程序员C++教程。
一、引用的基本使用 1.作用
给变量起别名
2.语法
数据类型 &别名 = 原名
3.示例
int main() {
//引用的基本语法
//数据类型 &别名 = 原名
int a = 10;
int &b = a;
cout << "a的值为:" << a << endl;
cout << "b的值为:" << b << endl;
b = 20;
cout << "a的值为:" << a << endl;
cout << "b的值为:" << b << endl;
system("pause");
return 0;
1、引用必须初始化
2、引用在初始化后,不可以改变。
- 代码示例
int main() {
//1、引用必须初始化
int a = 10;
//int &b;//错误必须初始化
int &b = a;
cout << "a的值为:" << a << endl;
cout << "b的值为:" << b << endl;
//2、引用在初始化后,不可以修改
int c = 20;
b = c;//这是赋值 *** 作,不是更改引用。
//即将b指向的内存改为20,由b和a指向同一块内存,则a也变为20
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
system("pause");
return 0;
- 小结
1、引用必须要初始化
2、一旦初始化后就不能修改
三、引用做函数参数
1.作用
作用:函数传参时,可以利用引用的技术让形参修饰实参
2.优点
可以简化指针修改实参
3.示例
//交换函数
//1、值传递
void swap01(int a,int b) {
int temp = a;
a = b;
b = temp;
cout << "进行值传递后:" << "a = " << a << "b = " << b << endl;
}
//2、地址传递
void swap02(int *p1, int *p2) {
int * temp = p1;
p1 = p2;
p2 = temp;
cout << "改变指针后的值为:" <<"p1 = "<<*p1<<"p2 = "<<*p2<< endl;
//int temp1 = *p1;//*p1即为取值。
//*p1 = *p2;
//*p2 = temp1;
//cout << "改变地址后的值为:" << "p1 = " << *p1 << "p2 = " << *p2 << endl;
}
//3、引用传递
void swap03(int &a,int &b) {
//采用引用的方式进行传递,相当于传入值后int &a = y;
//即给y取了个别名a,对a的任何 *** 作都是对y的 *** 作
int temp = a;
a = b;
b = temp;
}
int main() {
int a = 10;
int b = 20;
swap01(a, b);//值传递形参不会修改实参
cout << "swap01后的值为:" << " a = " << a << " b = " << b << endl;
swap02(&a, &b);//地址传递形参会修改实参
cout << "swap02后的值为:" << " a = " << a << " b = " << b << endl;
a = 10;
b = 20;
swap03(a, b);//相当于在int &a = a;相当于给a取了个别名,对别名进行 *** 作,即对原值进行 *** 作。
//引用传递可以修改实参
cout << "swap03后的值为:" << " a = " << a << " b = " << b << endl;
4.总结
通过引用参数产生的效果同按地址传递时一样的,引用的语法更清楚简单。
三、引用做函数的返回值
1.作用
引用是可以作为函数的返回值存在的。
2.注意
- 不要返回局部变量的引用
函数调用可以作为左值。
4.示例
//返回局部变量引用
int & y_test01() {//返回的仍是一个整型,用引用的方式进行返回
int a = 10;//局部变量,函数中执行完会被系统释放,放在四区中共的栈区
return a;
}
int& y_test02() {
static int a = 20;//静态变量存放在全局区,全局区的数据在程序结束后由系统释放
return a;
}
int main() {
//int &ref = y_test01();//返回的是a,此处是用ref去接收它
//cout << "ref = " << ref << endl; //第一次结果正确,是因为编译器做了保留
//cout << "ref = " << ref << endl;//第二次结果错误,因为a的内存已经被编译器释放
int &ref2 = y_test02();//将y_test02()返回的值取了个别名
cout << "ref2 = " << ref2 << endl;
cout << "ref2 = " << ref2 << endl;
//函数的输出作为左值
y_test02() = 1000;//y_test02()返回的是a的引用,则y_test02()作为左值后,直接对左值进行 *** 作。
cout << "ref2 = " << ref2 << endl;//ref2是a的别名
cout << "ref2 = " << ref2 << endl;
system("pause")
return 0;
}
三、引用的本质
1.本质
- 引用的本质在C++内部实现是一个指针常量
//引用的本质
//发现是引用,转化为int * const ref = &a
void func(int & ref) {//传入一个变量即可,例如传入a,则int &ref = a;
ref = 100;//ref是引用,转换为*ref = 100;
}
int main() {
int a = 10;
//自动转换为 int *const ref = &a;指针常量是指针指向不可改,
//也说明为什么引用不可更改
int &ref = a;
ref = 20;//ref是引用,自动帮我们转换为*ref = 20
cout << "a = " << a << endl;
cout << "ref = " << ref << endl;
func(a);
cout << "a = " << a << endl;
cout << "ref = " << ref << endl;
sytem("pause");
return 0;
}
3.运行结果
4.分析
5.小结
结论:C++推荐引用技术,因为语法方便,引用本质是指针常量,但是所有的指针 *** 作编译器都帮我们做了。
四、常量引用 1.作用作用:常量引用主要用来修饰形参,放置误 *** 作
- 在函数的形参列表中,可以加const修饰形参,放置形参改变实参。
//打印数据函数
void showValue(const int & val) {
//val = 1000;//参数列表添加const后,形参的值不可修改。
//常量可以修饰形参,防止误 *** 作。这样形参就不会改变外部的实参了。
cout << "val = " << val << endl;
}
int main() {
//常量引用
//使用场景:用来修饰形参,放置误 *** 作
int a = 10;
//int &ref = 10;//---错误//引用必须引用一块合法的内存空间,栈区或者堆区,而不是常量区
const int &ref = 10;
//加上const之后,编译器代码修改 int temp = 10;const int &ref = temp;
//ref = 20;//错误,加上const之后变为只读,不可及可以修改
a = 20;
showValue(a);
cout << "a = " << a << endl;
system("pause");
return 0;
五、总结
本章主要对引用进行了介绍,并对引用的本质进行了分析,引用的本质就是指针常量,指针的指向不可以更改,指针指向的值可以更改。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)