天天看點

C++資料成員

說明:static成員變量在繼承體系中隻有一份,其通路方式限制(public,private)和普通成員變量相同,但注意使用類名通路時應該B::val而不是B.val(與C#不同)。

1. static data member

(1) 每一個static member的存取,并不會造成任何空間或執行時間上的負擔。

另外 如果有Point org,*p=&org;

則org.x=0與p->x=0執行開銷完全相同,這也是唯一一種情況,因為static member并不在對象中,這隻是個文法上的便宜行事而已。

(2)即使這個static member是經過虛拟或間接繼承而來的,依然不影響他的存取效率。因為他是程式中的唯一實體。

(3)兩個類有同名的static member并不會造成名字沖突,因為屬于不同的Class,會被C++名字修飾機制修飾成不同名字。

(4)另外,如果取一個static member的位址會得到一個指向其資料類型的指針(如 int*),而不是一個指向其class member的指針。因為static member并不在一個class object之中。

2. Nonstatic Data Member

(1) 欲對一個nanstatic data member進行存取,編譯器需要使用對象的位址加上data member的偏移量(offset)。(data member的偏移量可在編譯期獲得)

(2) 對于org.x=0與p->x=0的存取效率,當x是一個直接類成員,或者在單一繼承、多繼承中(多繼承中offset也是在編譯期計算好的),兩者效率完全相同,但是如果x是虛基類的成員,則後者的存取效率會慢一些。因為編譯器不能确定p指向的基類還是派生類,而指向不同的類,虛基類的位置是不同的,也就導緻data member的偏移量不同,是以這個操作必須延遲到執行期。