225
windows
C++數據成員
Static成員
class B { public : static int val; }; int B::val=0; class D :public B { }; int _tmain(int argc, _TCHAR* argv[]) { B::val=5; cout <<D::val<<endl;//5 }
說明:static成員變量在繼承體係中隻有一份,其訪問方式限製(public,private)和普通成員變量相同,但注意使用類名訪問時應該B::val而不是B.val(與C#不同)。
Data member 的存取
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的偏移量不同,所以這個操作必須延遲到執行期。
最後更新:2017-04-03 12:56:00