2021-09-13 引用

本文详细讲解了C++中引用的概念,包括new操作符动态内存分配、引用初始化与不可变性、引用作为函数参数的值传递与地址传递,以及引用做返回值和左值的特性。重点强调了引用本质上的指针常量性质和常量引用的应用实例。
摘要由CSDN通过智能技术生成
  • new操作符

    int * p = new int(10);
    delete p;
    在此创建的数据在堆区,并且需要程序员自己释放 delete p;

  • 引用
    给一个变量起个别名
    int a = 10;
    int &b = a; //即让b也表示 和a同地址的变量 引用操作
    b = 20;
    cout << a << endl; //修改b的值 输出a也会被修改 因为a,b表示的都是同一个变量为20

  • 注意:
    1.引用必须初始化 , 不能单纯 int &b ;
    2.初始化后不可改变(不可换成别的变量比如int c = 50 ; int &b = c;)
    但是可以赋值 c = b;

  • 引用做函数参数
    通过引用,让形参来修饰实参
    值传递中 形参是不能修饰实参的 但是地址传递可以,引用传递同样也能完成。

//值传递
void mySwap01(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << "mySwap01a =" << a << endl;
	cout << "mySwap01b = " << b << endl;
}
//地址传递
void mySwap02(int *a,int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}
//引用传递
void mySwap03(int &a, int &b)  
// &符号表示为引用  这样接收 Swap03中的int &a的a  就是实参a的别名 
{                              //   只不过 名字都是a  
	int temp = a;
	a = b;
	b = temp;
}
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;
		system("pause");
    	return 0;
}
  • 引用可做函数返回值
int& test01()
{
	 int a = 10; //局部变量 存放在栈区 
	 return a;
}
int main()
{
//引用做函数的返回值
	int& ref = test01();
	cout << "ref=" << ref << endl; //第一次输出正确 编译器有所保留
	cout << "ref=" << ref << endl; //第二次乱码 a的内存编译器已经释放
		system("pause");
    	return 0;
}

在这里插入图片描述

第一次编译器做有保留
第二次已经释放,所以不为 10

所以不要返回局部变量的引用

2.函数的调用可以作为左值

//函数的调用可以作为左值
int& test02()
{
	static int a = 10; //静态变量存放在全局区 
	                   //该区数据由在整个程序结束后由系统释放
	return a;
}

int main()
{
	//引用做函数的返回值
	int& ref = test02();  //   int& ref = a;
	cout << "ref=" << ref << endl;
	cout << "ref=" << ref << endl;
	test02() =1000;   // 函数返回值为引用,函数test02 在赋值的左边
	cout << "ref=" << ref << endl;
	cout << "ref=" << ref << endl;
		system("pause");
    	return 0;
}

在这里插入图片描述
test02返回的是该函数中a的引用,即 把 a 的变量做了一个返回,
所以
test02() =1000; 即 a = 1000; 同时 ref 也是 a 的别名
如果函数的返回值是引用,这个函数可以作为左值

  • 引用的本质 即是一个 指针常量(指针的指向不可修改,但指向的值 可修改)
    int a = 10; 若地址为 0x0011
    int& ref = a ;
    自动转换为 int* const ref = &a; 因为const 所以不可改指向的地址
    指针 ref 内保存的数据为 a的地址 0x0011 ,
    ref =20;// 内部发现 ref 是引用,自动帮我们转换成 *ref = 20 ;
    输出 ref 也会自动转换成 *ref

  • 常量引用
    用来修饰形参,防止误操作。

注意: 引用必须引用一块合法的空间
不能
int & ref =10 ;
但是
const int & ref = 10 ;
可以 编译器会将代码修改为 int temp =10 ; const int & ref =temp; 且不能修改。

void test02(int &Val)
{
	 Val = 1000;
	cout << "Val =" << Val << endl;
}

int main()
{
	int a = 10;
	test02(a);
	system("pause");
   	return 0;
}

在这里插入图片描述
引用传递形参可修饰实参
在这里插入图片描述
若加上const Val则不能被修改

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值