这几天看Effective C++里面不停的提到引用把我弄得有些懵,就来整理一下引用的部分知识
什么是引用?
引用是某个变量的别名
比如一个人的名字是张三,他的小名三三就是一个别名
张三是他,三三也是他
为了说明这个实例,我们举个例子:
int zhangsan;
int& ceshi() {
return zhangsan;
}
int main() {
zhangsan = 6;
int& sansan = ceshi();
cout << zhangsan << endl;
cout << &zhangsan << endl;
cout << sansan << endl;
cout << &sansan << endl;
sansan++;
cout << zhangsan << endl;
}
可以把赋值看成是张三的年龄,取地址看成张三的身份证号
输出如下
6
0x109ee9078
6
0x109ee9078
7
可以看到,三三和张三就是一个人,他们年龄一样身份证号也一样,三三年龄增加一岁就是张三年龄增加一岁
也就是定义一个引用并不是定义了一个新的变量,并没有为这个引用分配地址空间,对引用的操作就是对这个变量本身的操作
就跟你打了张三一拳,老师问你是不是你打的三三,你回答你打的是张三,老师就知道罪魁祸首就是你了一样
没有张三这个人的时候,三三会存在吗?
班上连张三这个人都没有,你叫三三会有人理你吗?
当然不会
所以,在引用的时候,我们需要为其赋初始值,告诉程序这个别名是哪个对象的别名
int& sansan;
报错:
declaration of reference variable 'sansan' requires an initializer
你在班上疯狂的叫三三,会有人提醒你,没有三三这个人
在Effective C++里面经常提到用pass by reference传递对象代替pass by value,其实就是以传引用的方式代替传值的方式
比如一个比较经典的交换值的函数
在排队的时候,要交换张三李四的位置
void change_position(int& a, int& b) {
int position = a;
a = b;
b = position;
}
int main() {
int zhangsan = 10;
int lisi = 12;
// swap(zhangsan, lisi);
cout << zhangsan << " " << lisi << endl;
change_position(zhangsan, lisi);
cout << zhangsan << " " << lisi << endl;
}
输出:
10 12
12 10
交换了位置
可以看到在change_position函数内对别名a,b的操作没有加‘&’符号,因为一开始你给张三取了别名叫三三,&是代表sansan是zhangsan的别名,在取的时候你会说别名是三三,在日后用到的时候就不需要说取一个别名三三了,也就是之后操作这个别名的数据的时候不需要再带一个‘&’符号了