指针和对象存取数据成员有什么区别?

来源:互联网 发布:网络端口怎么接 编辑:程序博客网 时间:2024/06/06 17:15

  如果我们有两个定义:

Point3d origin,*pt = &origin;

  用它们来存取data member,像这样:

origin.x = 0.0;pt->x = 0.0

  通过origin存取,和通过pt存取,有什么重大差异么?

  当Point3d是一个derived class,而其继承结构中有一个virtual base class,并且被存取的member(如本例中的x)是一个从该virtual base class继承而来的member时,就会有重大区别。
  我们不知道编译时期这个member真正的offset位置,也就是说我们不直到pt必然指向哪一种class type,所以这个存取操作必须延迟至执行期,经由一个额外的间接导引,才能解决;但如果用origin,就不会有这些问题,其类型无疑是Point3d class,而即使它继承自virtual base class,members的offset位置也在编译时期就固定了。一个积极进取的编译器甚至可以静态地经由origin就解决掉对x的存取。

0 0
原创粉丝点击