指针和REF



  指针继承自 C 语言,也是操作数据最灵活最强大的武器;REF,中文名为引用,则可以认为是指针的一个“语法糖”。REF 使用起来更方便、更安全、也更可靠,它和指针一样也具有多态性。

指针

  指针可以看成一个复合类型,它由 A 和 T 组成,A 表示指针指向的物理地址, T 表示地址包含的类型。通常来说,A 在运行期才有意义;T 在编译器有意义,C++ 编译时进行了类型擦除(与JAVA泛型区分开),编译后已经失去了类型信息(C++ 支持RTTI,但并不是指针本身保存了这一变量)。指针在物理上仅仅是内存中的一个地址,甚至说是一个整数,但是它的运算规则和读取规则却是由它指向的内容来决定,void* 本身指针作为二进制数据存储的指向,而不能解析为类型,所以它不可以解引用。
  需要留意的是,虽然先有类才有有指针,但是指针其实自成一体;指针和类是工作关系,而并非类的附属品。

REF

  C++ 的指针继承自 C,但是 REF 是 C++ 独创。REF 是一个已知变量的“异名”。
  REF 在底层实现是通过指针来完成的,它的用途是模拟变量的行为,而不像指针可以反复赋值反复浏览,REF 使用赋值符号调用的赋值构造函数!REF 是一个已经存在实例的代理,但是它不仅仅是一个指针。
  REF 拥有“指针和对象的二象性”。即,REF 可以在需要的时候表现为指针,也可以表现为对象。

Object o1, o2;
Object *p1 = &o1, *p2 = &o2;

p1 = p2; // 指针赋值
Object &r1 = o1, &r2 = o2;// 类似指针赋值,指针性质

Object o3 = o1; // 对象构造,调用构造函数
o3 = o2; // 对象赋值,调用赋值构造函数
r1 = o2; // 类似对象赋值,调用赋值构造函数

总结

  REF 是 C++ 中基于指针的类型,在语义上初始化时等同于指针,使用时类似于对象,但是在语法上与具体对象使用完全一致,可以理解为一个既方便使用又提高效率(指针语义)的语法糖。所以可以说,引用是一个编译期的概念,对于指针增加了编译期检查;但又不是指针的真子集,它修改了指针的赋值特性。


[引用参考]

1.C++语义与性能分析

Tags :

About the Author

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注