- 论坛徽章:
- 0
|
原帖由 思一克 于 2008-11-28 16:06 发表
从计算机体系结构层面讲,
可以传递的只有"值"和"地址".
引用是编译层面做的一个给编程序人的一个"假象".
实际上可以做的这样的"假象"是很多的.
比如:
func(i),
编译可以将i放到一个什么(比如A)里面, 然 ...
“假象”这种说法确实是引用和指针的关系,但引用的这种“假象”又怎么会迷惑编程者呢?他是给编程者一个更为抽象的视图,还是我前面说过的“让类型成为程序中的原子”;
指针是赤裸裸的,它让你可以剥开一个类型的外衣看看它的内部,可它又不知道这个类型的内部组织结构,它认为他们都是顺序的字节块,于是随便的拿几个出去用(肯定可以这么做,因为指针可以任意的转换,那它指向的块的大小就可以变了,随意找些位置拿来用用,都是合理的)。
至于引用在编译后变成什么样,那是用户透明的,良好的实现应该是编译器去关心。
还是忍不住举个例子:
class a {
private:
int a;
int b;
public:
a(void);
char getAChar(void *b);
};
a *testa = new a();
char *b = (char *)testa;
.
.
. (若干代码之后)
.
printf("%s", b++); 这会是什么,只有老天爷知道,可是指针让这么做;引用,没这个问题 |
|