第八十九天学习记录:C++核心:引用

引用的基本使用

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

#include<iostream>
using namespace std;

int main()
{
    
    
	//引用基本语法
	//数据类型  &别名 = 原名

	int num1 = 3;
	int &num2 = num1;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;
	num2 = 30;
	cout << "num1=" << num1 << endl;
	cout << "num2=" << num2 << endl;
	return 0;
}

在这里插入图片描述

问:typdef在C语言是定义别名,但在C++还有用吗?C++可以用&来取别名
答:
在C++中,typedef仍然可用来定义类型别名。它的使用方式与C语言中相同。例如,你可以使用typedef来为一个复杂的数据类型创建一个更简洁的别名,以增加代码的可读性。

另外,在C++11之后,引入了更强大的类型别名机制,即使用关键字using。相比于typedef,using更灵活且易于使用。例如,你可以使用using来定义别名模板、别名函数指针等。

当然,在C++中,你也可以使用引用(&)来创建类型的别名。引用别名在某些情况下可以更直观地表示变量引用关系。例如,使用引用别名可以避免一些指针操作。但请注意,引用别名不同于类型别名,它更多地是用于引用变量的别名而不是类型本身的别名。

总而言之,尽管C++提供了更多强大的类型别名机制,但typedef在C++中仍然是有效的,并且可以根据具体情况选择合适的方式来定义类型的别名。

引用的注意事项

1、引用必须初始化
2、引用在初始化后,不可改变

	int a = 10;
	int &b = a;
	int c = 20;
	b = c;//此处为赋值操作,而不是更改引用

引用做函数参数

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

#include <iostream>
using namespace std;

void mySwap01(int a, int b)
{
    
    
	int tmp = a;
	a = b;
	b = tmp;
}

void mySwap02(int* a, int* b)
{
    
    
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

void mySwap03(int &a, int &b)
{
    
    
	int tmp = a;
	a = b;
	b = tmp;
}

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;
}

引用做函数返回值

作用:引用是可以作为函数的返回值存在的

注意:不要返回局部变量引用
用法:函数调用作为左值

#include
using namespace std;

int& test01()
{
int a = 10;
return a;
}

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 << “ref=” << ref2 << endl;
cout << “ref=” << ref2 << endl;
cout << “ref=” << ref2 << endl;
test02() = 666;
cout << “ref=” << ref2 << endl;
cout << “ref=” << ref2 << endl;
return 0;
}

引用的本质

本质:引用的本质在C++内部实现是一个指针常量
在这里插入图片描述
结论:C++推荐用引用技术,因为语法方便,引用本质是指针常量,但是所有的指针操作编译器都帮我们做了

常量引用

作用:常量引用主要用来修饰形参,防止误操作
在函数形参列表中,可以加const修饰形参,防止形参改变实参

问:为什么 int &a=10;会报错?
答:
在C++中,当我们使用引用时,引用必须被初始化为一个已经存在的对象。引用是一个别名,它必须引用一个实际存在的对象,而不能引用一个字面值或临时对象。
因此,当你尝试使用int &a = 10;这样的代码时,它会导致编译错误。因为10是一个字面值(常量),它并不是一个具体的、可修改的对象,所以不能将一个引用绑定到它上面。
如果你想使用引用来引用一个常量值,可以使用常量引用。常量引用可以绑定到一个字面值或常量,并且允许读取该值,但不允许修改它。下面是一个示例:

const int &a = 10;

在这个示例中,我们将一个常量引用绑定到了常量值10上,这是合法的。这意味着我们可以使用引用a来读取常量值10,但不能修改它。
总结:使用引用时,引用必须被初始化为一个已经存在的对象,因此不能将引用绑定到一个字面值或临时对象。如果需要引用常量值,可以使用常量引用。

#include <iostream>
using namespace std;

void showValue(const int &val)
{
    
    
	cout << "val=" << val << endl;
}

int main()
{
    
    
	//int &ref = test01();
	//cout << "ref=" << ref << endl;//第一次结果正确,是因为编译器做了保留
	//cout << "ref=" << ref << endl;//第二次结果错误,因为a的内存已经释放
	int a = 100;
	showValue(a);
	cout << "a=" << a << endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45694614/article/details/131430461
今日推荐