【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的时候,该对象应该失效了,但不清楚为什么程序运行就不会出错)

C++ 中,`&` 可以用于引用类型 (reference type) 的声明。引用类型是一种特殊的变量类型,它可以用于直接访问其他变量的地址和值,而不需要进行拷贝。 下面是一些 `&` 的常见作用: 1. 声明引用类型变量:可以通过 `&` 符号来声明引用类型变量,如 `int &ref = x;`,其中 `ref` 是一个引用类型变量,它引用了 `x` 的地址和值。 2. 函数参数传递:可以使用引用类型作为函数的参数类型,从而实现对函数外部变量的修改。这种方式通常比传递指针或拷贝变量更高效、更安全。例如,可以定义一个函数 `void swap(int &a, int &b)`,来实现两个整数变量的交换。 3. 返回引用类型:函数可以返回引用类型,这样可以直接操作函数内部的变量或对象。例如,可以定义一个函数 `int &getMax(int &a, int &b)`,返回两个整数变量中较大的那个。 4. 避免不必要的拷贝:在 for-each 循环中,使用引用类型可以避免对数组或容器中的元素进行不必要的拷贝,提高程序效率。例如,可以使用 `for(auto &i : arr)` 来遍历 `arr` 数组中的每个元素。 5. 用于类的成员变量:在类中,可以使用引用类型作为成员变量,来引用其他变量或对象。这种方式可以实现对象之间的数据共享和交互。例如,可以定义一个类 `Person`,其中的成员变量 `int &age`,来引用一个整数变量表示人的年龄。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值