关键词: C++引用
0.前言
引用并非对象,相反的,它只是为一个已经存在的对象所起的另外一个名字。
这句话摘自C++ Prime 的46页。仔细品味这句话,就会产生很多疑惑。第一,引用并非是对象,那么引用是什么?第二,引用是所存在对象的别名,“别名”的具体含义是什么?它占用内存空间吗?它和指针变量有什么区别?所有的这些疑问将在本文中给以解答。我们将遵从认知事物的规律,从认识、理解和总结三个步骤来把握C++引用。
1.认识C++引用——看山是山,看水是水
关于引用,我们首先了解一下C++ Prime的定义:
引用(reference)为对象起了另外一个名字,引用类型引用(refer to)另外一种类型。通过将声名符写成&d的形式来定义引用类型,其中d是声名的变量名。
举个例子:
1 |
|
在上述代码中,我们通过int &j = i;
来声名j
是引用对象的变量,指向对象i
。要注意的是,引用必须初始化,诸如int &j;
这样的代码是无法编译通过的。我们在定义引用时,所完成的操作并不是像其它初始化操作一样,将初始值拷贝到新建的对象中,而是将引用和它的初始值绑定在一起,并没有将初始值拷贝给引用。举个现实生活中的例子作为类比理解。有一个人的身份证正式姓名为李鹏程,他的外号叫作阿程。我们可以在日常生活中通过李鹏程这个名字来找到他,也可以通过阿程这个名字来找到他。阿程这个外号如果脱离了李鹏程这个人的实体,也就失去了它的含义。同理,如果我们说李鹏程长胖了10斤,也就意味着阿程也长胖了10斤。阿程这个外号和李鹏程这个实体是一一对应的关系,引用同引用的对象也是一一对应的关系。引用不可以重新绑定到另外一个对象,就像是不可以把阿程这个外号用在另一个人身上。上述代码的运行结果也说明了我们的认识是正确的。
代码运行结果:
1 | 10 10 |
可以看见,引用变量的值就是所引用的对象的值,引用变量的地址也就是所引用的对象的地址。到现在,我们初步认识了引用的含义和引用的用法。