C++ 引用概念

这几天看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的别名,在取的时候你会说别名是三三,在日后用到的时候就不需要说取一个别名三三了,也就是之后操作这个别名的数据的时候不需要再带一个‘&’符号了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值