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