指針和對象存取數據成員有什麼區別?

  如果我們有兩個定義:

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的存取。

發佈了129 篇原創文章 · 獲贊 45 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章