C++引用

C++引用,第1张

1.1 基本用法

引用区别于地址与变量名

如果使用*就是地址传递如果使用&就是引用传递如果使用变量名就是值传递

引用容易与指针混淆,我们需要探讨引用在C++中到底代表什么

引用类型的变量会占用内存空间,占用的内存空间的大小和指针类型的大小是相同的。 从上面的汇编代码可以看出,虽然引用是一个对象的别名,但是在汇编层面,和指针是一样的。

不能将指针赋值给引用

	//开辟一个空间存储一个int 10
	int* a = new int(10);
	//int& e = a; //不可以

指针和引用是同一层的内容,引用只能将变量名赋值给它。

	int c = 10;
	int& d = c;

注意:在变量名上机上&代表取地址

1.2 引用注意事项 引用必须初始化引用在初始化之后,不可以改变
int main() {

	int a = 10;
	int b = 20;
	//int &c; //错误,引用必须初始化
	int &c = a; //一旦初始化后,就不可以更改
	c = b; //这是赋值 *** 作,不是更改引用

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	cout << "c = " << c << endl;

	system("pause");

	return 0;
}
1.3 引用做函数参数

使用引用作为函数的参数
函数的形参我们已经学习过:

可以使用值传递,将变量名作为形参可以使用指针,作为址传递现在我们可以使用引用,作为引用传递
#include
using namespace std;
void swap(int& a, int& b);
int main() {
	int a = 10;
	int c = 11;
	cout << "修改之前的a" << a << "修改之前的b" << c << endl;
	int& b = a;
	swap(a, c);
	cout << "修改之后的a" << a << "修改之后的b" << c << endl;
}

void swap(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}
1.4 引用做函数返回值
int& ref() 
{
	//局部变量
	int a = 10;
	return a;
}

int main() {
	int a = 10;
	int c = 11;
	cout << "修改之前的a" << a << "修改之前的b" << c << endl;
	int& b = a;
	swap(a, c);
	cout << "修改之后的a" << a << "修改之后的b" << c << endl;

	cout << "--------" << endl;

	int& d = ref();
	cout << d << endl;
}

不能返回局部变量的引用,因为局部变量在栈中,当函数调用完成,栈空间被释放,当前引用为一个无效内存,相当于是一个野指针,非常危险

函数作为左值
int main() {
	int a = 10;
	int c = 11;
	cout << "修改之前的a" << a << "修改之前的b" << c << endl;
	int& b = a;
	swap(a, c);
	cout << "修改之后的a" << a << "修改之后的b" << c << endl;

	cout << "--------" << endl;

	int& d = ref();

	//当函数作为左值,函数必须返回的是一个引用,当然函数中的局部变量最好作为静态变量
	ref() = 100;
	cout << d << endl;
}

![image.png](http://www.kaotop.com/file/tupian/20220919/ebfc8796e6e5cbcd7ba57e2497af6fa7.png#clientId=u16e312c3-07ee-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=156&id=u769f01cb&margin=[object Object]&name=image.png&originHeight=303&originWidth=718&originalType=binary&ratio=1&rotation=0&showTitle=false&size=32842&status=done&style=none&taskId=uf065cd05-ce9c-4705-b9aa-0eebe96fa49&title=&width=370.51300048828125)
因为函数不是引用返回的时候,主函数中的返回值相当于是内存中的一份拷贝

1.5 引用的本质

引用在C++内部的实现是作为一个指针常量,所以不能够对指针进行二次指向

//函数形参为引用,自动转换为 int * const a = &a;
void swap(int& a, int& b) 
{
	
	int temp = a;
	a = b;
	b = temp;
}

C++推荐使用引用技术,因为语法更方便,引用本质是指针常量,但是所有的指针 *** 作编译器都帮我们做了

1.6 常量引用

常量引用与指针相同,修饰引用之后不可以改变引用所指向的值,防止形参将实参修改

//函数形参为引用,自动转换为 int * const a = &a;
void swap(const int& a, int& b) 
{
	
	int temp = a;
	a = b; //报错
	b = temp;
}

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

原文地址:https://54852.com/web/2990214.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存