Visual Studio2017C++学习笔记(十一)-引用

Visual Studio2017C++学习笔记(十一)-引用,第1张

前言

软件为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.注意事项
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.注意
  • 不要返回局部变量的引用
3.用法

函数调用可以作为左值。

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++内部实现是一个指针常量
2.示例
//引用的本质
//发现是引用,转化为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修饰形参,放置形参改变实参。
2.代码示例
//打印数据函数
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;

五、总结

本章主要对引用进行了介绍,并对引用的本质进行了分析,引用的本质就是指针常量,指针的指向不可以更改,指针指向的值可以更改。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1295911.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-10
下一篇2022-06-10

发表评论

登录后才能评论

评论列表(0条)

    保存