August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
当传递占用存储空间小的值,如一个整数、一个双精度数或者一个单词(6.3.2节)时,传值方式简单、直接、高效。但对于占用存储空间大的值,如一个图像(通常有几百万位大小)、一个大表(比如说几千个整数)或一个长字符串(比如说几百个字符)时,又如何呢?这种情况下,拷贝的代价就会非常高。我们不必为拷贝代价所困扰,但做不必要的工作就可能会很麻烦了,这意味着我们不能直接表达我们想要什么。例如,我们可能会编写下面这个函数来打印一个浮点数vector:
这个print()函数适用于所有规模的vector,例如:
这段代码可以得到我们想要的结果,但首次调用print()需要拷贝10个双精度数(大概80个字节),第二次调用需要拷贝一百万个双精度数(大概8兆字节),而第三次调用需要拷贝多少字节我们不知道。在此,我们必须问自己一个问题:“为什么我们要拷贝全部数据?”我们只不过是想打印vector,而不是拷贝它们的元素。显然,必须要有一种方法,能使我们向函数传递一个变量,而不拷贝其值。一个类似的例子是,如果你被分派了一个任务——为图书馆中的书籍建一个目录,馆长不会给你送去图书馆大楼和其内所有内容的一份拷贝,而只是把图书馆的地址发送给你,这样你就能到图书馆去浏览馆藏书籍。因此,我们需要某种方法,能将要打印的vector的“地址”而不是其拷贝传送给print()函数。这样的“地址”被称为引用(reference),其使用方法如下: ...