C++从零开始(八)――C++样例一(二)

2014-11-24 13:20:07 · 作者: · 浏览: 37
是用某软件打开这个文件或是直接执行此文件等),但如果删除此快捷方式却并不会删除其所指向的文件,因为它只是“对某文件执行操作”的引用。
人的名字就是对“某人进行标识”的引用,即说某人考上大学通过说那个人的名字则大家就可以知道具体是哪个人。同样,变量也是引用,它是某块内存的引用,因为其映射了地址,而内存块可以通过地址来被唯一表明其存在,不仅仅是标识。注意其和前面的名字不同,因为任何对内存块的操作,只要知道内存块的首地址就可以了,而要和某人面对面讲话或吃饭,只知道他的名字是不够的。
应注意对某个东西的引用可以不止一个,如人就可以有多个名字,变量也都有引用变量,手机号码也可以不止一个。
注意上面引入了函数来表示交换,进而导致了盒子也就成了资源,因此必须将盒子映射成数字。而前面又将盒子里装的卡片映射成了long类型的数字,由于“装”这个操作,因此可以想到使用能够标识装某个代表卡片的数字的内存块来作为盒子映射的数字类型,也就是内存块的首地址,也就是long*类型(注意不是地址类型,因为地址类型的数字并不返回记录它的内存的地址)。所以上面的函数参数类型为long*。
下面看右侧的程序。参数类型变成long&,和指针一样,依旧表示引用,但注意它们的不同。后者表示它是一个别名,即它是一个映射,映射的地址是记录作为参数的数字的地址,也就是说它要求调用此函数时,给出的作为参数的数字一定是有地址的数字。所谓的“有地址的数字”表示此数字是程序员创建的,不是编译器由于临时原因而生成的临时内存的地址,如Swap( a1++, a2 );就要报错。之前已经说明,因为a1++返回的地址是编译器内部定的,就程序逻辑而言,其是不存在的,而Swap( ++a1, a2 );就是正确的。Swap( 1 + 3, 34 );依旧要报错,因为记录1 + 3返回的数字的内存是编译器内部分配的,就程序逻辑上来说,它们并没有被程序员用某块内存记录起来,也就不会有内存。
一个很简单的判定规则就是调用时给的参数类型如果是地址类型的数字,则可以,否则不行。
还应注意上面是long&类型,表示所修饰的变量不分配内存,也就是编译器要静态地将参数r1、r2映射的地址定下来,对于Swap( a1, a2 );就分别是a1和a2的地址,但对于Swap( a2, a3 );就变成a2和a3的地址了,这样是无法一次就将r1、r2映射的地址定下来,即r1、r2映射的地址在程序运行时是变化的,也就不能且无法编译时静态一次确定。
为了实现上面的要求,编译器实际将会在栈上分配内存,然后将地