c++学习笔记(基于b站黑马程序员)

本文详细介绍了C++中的引用概念,包括引用的基本使用、注意事项、作为函数参数的优势、作为函数返回值的用法,以及引用的本质——实际上是一个指针常量。同时强调了常量引用的作用,用于保护形参不被意外修改。
摘要由CSDN通过智能技术生成

3引用

3.1引用的基本使用

作用:给变量起别名
语法:数据类型 &别名=原名

#include<iostream>
using namespace std;
#include<string>

int main() {
	int a = 10;
	int& b = a;//给变量a起别名
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	b = 100;//利用别名修改内存后重新打印
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	system("pause");
	return 0;
}

程序输出结果为a=10;b=10;a=100;b=100
引用就是刚开始我定义了一块内存,我用变量a表示它,但是我现在又想再利用另一个变量b来表示,这种是允许的,这种方式就是引用,并且我无论是利用原名还是别名都可以修改内存中的值。

3.2引用的注意事项

引用必须初始化,引用在初始化后不可以改变。
引用初始化意思就是我们得先有a这种原名,再定义别名b,不能在没有a的时候就定义别名b;
初始化不能改变,就是引用要从一而终,当我们已经将b当作a的别名,不能再变成c的别名。

#include<iostream>
using namespace std;
#include<string>

int main() {
	//int& b;//错误,需要先初始化
	int a = 10;
	int& b = a;//给变量a起别名
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	int c = 20;
	b = c;//这行代码没错,但这是赋值操作,不是引用操作,就是单纯的把b修改成20
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	cout << "c= " << c << endl;
	system("pause");
	return 0;
}

3.3引用做函数参数

作用:函数传参时,可以利用引用的技术让形参修饰实参
优点:可以简化指针修改实参

#include<iostream>
using namespace std;
#include<string>

//1、值传递
void myswap01(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << "swap01a= " << a << endl;
	cout << "swap01b= " << b << endl;
}
//2、地址传递
void myswap02(int* a, int* b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
	cout << "swap02a= " << a << endl;
	cout << "swap02b= " << b << endl;
}

//3、引用传递
void myswap03(int &a, int &b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << "swap03a= " << a << endl;
	cout << "swap03b= " << b << endl;
}
int main() {
	
	int a = 10;
	int b = 20;
	myswap03(a, b);
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	
	system("pause");
	return 0;
}

在上述三种函数中,值传递中形参变化不会改变实参,其余两种都会;别名可以和原名一样
引用传递结果和地址传递一样,语法更简单

3.4引用做函数返回值

作用:引用是可以作为函数返回值存在的
注意:不要返回局部变量引用
用法:函数调用作为左值

#include<iostream>
using namespace std;
#include<string>
//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;//第二次结果错误,是因为a已经被释放
	int& ref2 = test02();
	cout << "ref2= " << ref2 << endl;
	cout << "ref2= " << ref2 << endl;//结果一直正确,因为a没有被释放
	test02() = 1000;//如果引用作为函数返回值,可以作为左值存在,本质就是把a改成1000,然后ref2在利用别名的方式访问
    cout << "ref2= " << ref2 << endl;
	cout << "ref2= " << ref2 << endl;//四行结果分别为10 10 1000 1000
	system("pause");
	return 0;
}

3.5引用的本质

引用的本质在c++内部实现是一个指针常量

int a=10;
int &ref=a;//编译器会自动转换成int* const ref=&a,指针常量是指针指向不能变,也就是为什么引用不可改变
ref=20//自动转换成*ref=20;

3.5常量引用

作用:用来修饰形参,防止误操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值