C++ 引用

引用

引用的本质

  • Type* const ref = &Type_value
  • 指针的指向不可修改
//----------------------------------------------------------------------------------
// 2.1 C++编译器背后做了什么工作
//	b--->11
//	a:  11
//	b : 11
//	& a : 15727144
//	& b : 15727144    ///!这里b的地址和a的地址是一样的
//  a:      100
//  sizeof(RF_Size_t) 8
//----------------------------------------------------------------------------------
static void myPrintA(int &m)
{
	m = 100;
	return;
}

typedef struct RF_Size {
	int& a;
	int& b;
}RF_Size_t;

static void myReferenceSize(void)
{
	printf("sizeof(RF_Size_t) %d\n", sizeof(RF_Size));
	return;
}


static void test_reference_essence(void)
{
	int a = 10;
	int& ref = a;						//单独定义时,必须初始化
										//自动转化为int* const ref  = &a
	ref = 11;							//内部发现ref是引用,自动帮我们转换成*ref = 20
	cout << "ref--->" << a << endl;
	printf("a:	%d\n", a);
	printf("ref:%d\n", ref);			
	printf("&a: %d\n", &a);
	printf("&ref: %d\n", &ref);			//a和b 指向同一空间的门牌号

	myPrintA(a);					//不需要传递&a, 
	printf("a:	%d\n", a);

	myReferenceSize();				//引用有自己的空间,是常指针,相当于 int *const p;

	return;

}

函数返回的值是引用

//----------------------------------------------------------------------------------
// 2.2 函数返回值是引用(引用当左值)
//----------------------------------------------------------------------------------
// output:
//	a1:10
//	a2:10
//	a3 : 6955218
//----------------------------------------------------------------------------------
static int getAA1()
{
	int a;
	a = 10;
	return a;
}

static int& getAA2()
{
	int a;		//如果返回栈上的引用,此处为一个不好的示例
	a = 10;
	return a;
}

static int* getAA3()
{
	int a;
	a = 10;
	return &a;
}

static int& g2(int* value)			//返回值是型参,当引用
{
	*value = 100;
	return *value;
}

static void  test_reference_asleftvalue(void)
{
	int a1 = 0;
	int a2 = 0;
	a1 = getAA1();

	a2 = getAA2(); 
	int& a3 = getAA2();				//若返回栈变量	不能成为其它引用的初始值

	printf("a1:%d \n", a1);			//10
	printf("a2:%d \n", a2);			//10, 第一次编译器做了保留
	printf("a3:%d \n", a3);			//6955218 ,第二次则输出乱码,此时内存空间已经被编译器回收了

	int m1 = 10;
	m1 = g2(&m1);
	int& m2 = g2(&m1);
	printf("m1: %d\n", m1);
	printf("m2: %d\n", m2);
	return;
}

指针的引用

//----------------------------------------------------------------------------------
// 2.3 指针的引用
//----------------------------------------------------------------------------------
// output:
//----------------------------------------------------------------------------------
typedef struct Teacher {
	char name[64];
	int  age;
}Teacher_t;

static int getTeacher_1(Teacher_t **myp)		//传递指针的指针的方式给指针赋值
{
	Teacher_t* p = (Teacher_t*)malloc(sizeof(Teacher_t));
	if (p == NULL)
	{
		return -1;
	}
	memset(p,0,sizeof(Teacher_t));
	p->age = 33;

	*myp = p;
	return 0;
}

static int getTeacher_2(Teacher_t* &myP)  //对指针的引用
{
	myP = (Teacher_t*)malloc(sizeof(Teacher_t));
	if (myP == NULL)
	{
		return -1;
	}
	memset(myP, 0, sizeof(Teacher_t));

	myP->age = 35;
	return 0;
}

static void test_reference_point(void)
{
	Teacher_t* p = NULL;
	
	//getTeacher_1(&p);
	getTeacher_2(p);			

	printf("age:%d\n", p->age);
	return;
}

常量引用

  • const 引用,让变量只有只读属性
//int& ref = 10;     //编译器不通过,因为引用必须指向一块合法的内存空间
const int& ref = 10; //编译器做了修改: int tmp = 10; int& ref = tmp
//ref = 20;          //无法修改,加入const后,变成只读
  • 使用场景: 常量引用主要用来修饰形参,防止误操作
  • 在函数形参列表中,可以加const修饰形参,防止形参改变实参
void showValue(const int& v)
{
	//v++;   //不允许
	cout<< v << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值