【C++】引用&

目录

引用的概念

引用作为函数的参数

引用作为函数的返回值

返回值是左值

引用是否有效


引用的概念

引用(reference)本质上就是指针。

指针类型引用类型
int*int&
double*double&
Object*Object&

指针定义: int a =123; int* p = &a;

引用定义:int a = 123; int& r = a;

int main()
{
	int a = 3;
	int& b = a;
	b = 4;
	printf("a:%d \n", a); 
	printf("b:%d \n", b);
	return 0;
}

输出结果为:

a:4

b:4

从结果可以看出,b其实就a的一个别名,a和b是完全一样的。a和b是同一个地址。

再看一个例子:

struct Student
{
	int id;
	char name[16];
};

int main()
{
	Student stu1 = {1, "nick"};
	Student& stu2 = stu1;
	stu2.id = 10;

	return 0;
}

其中改变过后stu1和stu2的id都变为了10.

注意:

(1)引用必须在定义的时候初始化。指针在定义的时候可以不初始化。

(2)在定义的时候就与目标对象绑定,无法解绑。

int main()
{
	int a = 1;
	int b = 2;
	int& c = a;
	c = b;
	printf("a:%d \n", a);
	printf("b:%d \n", b);
	printf("c:%d \n", c);

	return 0;
}

结果为:a=b=c=2。也就是说a就是c,c就是a。

引用作为函数的参数

和指针类似。

void test(int& a)
{
	a = 100;
}

int main()
{
	int number = 0;
	test(number);
	printf("number:%d\n", number);

	return 0;
}

小结:可以看出传进去一个引用后,在test函数中改变a,number也会改变。其实这里a就是number,number就是a。

传引用和传地址一样,都能节省系统资源。如果你直接传递参数,就相当于copy了一份变量给函数,有些浪费系统资源。

引用作为函数的返回值

int number = 0;
int& test()
{
	return number;
}

int main()
{
	int& r = test(); //其实就相当于int& r = number;
	r = 100;

	int c = test(); //这里居然也能通过编译,应该是将引用强转成了int类型
	c = 10;

	printf("number:%d", number);
	printf("c:%d", c);

	return 0;
}

结果为:

number:100

c:10

返回值是左值

int number = 0;
int& test()
{
	return number; 
}

int main()
{
	test() = 123;

	printf("number:%d", number);

	return 0;
}

结果为:

number:123

只有引用的时候才能作为左值,但不推荐这么写,有点不好理解。

引用是否有效

主要是通过检查目标对象是否有效。如果有效,则引用可用。 

struct Student
{
	int id;
	char name[16];
};

Student& test()
{
	Student stu;
	return stu;
}

int main()
{
	Student& r = test();
	r.id = 100;

	return 0;
}

上面这个例子有问题的(具体问题在哪我还没有理解,他们都说是在test中申明了一个对象stu,在返回stu的时候,该对象应该失效了,但不清楚为什么程序运行就不会出错)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值