2-1 复合类型 引用
1 引用
- 不真实存在
- 不可以绑定临时值,可以绑定常量
- 引用必须初始化
2 基本属性
引用通俗理解就是相当于实现了一个绑定,它并不是真是存在的。引用通常用于传递参数,只需要传一个引用进去,而不是拷贝进去,引用的方式相对节省操作时间。以下面程序为例简单介绍引用:
int main() {
int local_price=12;
int &replace_price=local_price;
cout<<&local_price<<endl;
cout<<&replace_price<<endl;
for(int i=0;i<4;i++){
local_price=i;
cout<<replace_price<<endl;
}
return 0;
}
得到的输出结果为
0x11a3dff79c
0x11a3dff79c
0
1
2
3
可以看到二者在内存中的地址是一样的,也就是说引用不真实存在。在接下来的循环中可以发现对local_price
赋的值同样赋给了replace_price
,即所谓的“引用实现了绑定的效果”
3 注意事项
在使用引用时要注意它不能够绑定没有真实内存的量,比如
string & a="hello";
int b=16;
这些都是错误的写法,无法绑定,编译器不会帮你去绑定这样一个临时的值,它会认为没有必要,如果你需要改变这样一个临时的值,那为什么不用一个变量把它存下来。
但是它是可以绑定常量的,比如:
const int &b=16;
这一步是因为编译器在看到const
后帮我们进行了如下操作:
const int temp=16;
b=temp;
除了不可以绑定临时值以外,还需要注意的一点是引用必须初始化,如果只是做了声明,那么编译器会报错,这也是和指针的一个区别。
4 引用作为函数参数
按引用传递允许被调用的函数能够访问并改变调用函数中的变量,如果我们试图让函数使用传递给它的信息,而不对这些信息进行修改,那么就需要使用常量引用。
void function(int &a);
void function(const int &a);//常量引用
要注意的一点是,通常我们在传递基本类型参数时,应采用按值传递,不建议使用引用的方式。如果我们不加const
,会导致被调用函数在我们不知情的状况下改变原来的值。只有当数据比较大的时候(类或者结构体),引用参数才会变得很有用。并且加或不加const
取决于我们使用这个函数的目的。