Data 語義學(xué)
一個class的data members,一般而言,可以表現(xiàn)這個class在程序執(zhí)行時的某種狀態(tài)。Nonstatic data members放置的是“個別的class object”感興趣的數(shù)據(jù),static data members則放置的是“整個class”感興趣的數(shù)據(jù)。
C++對象模型盡量以空間優(yōu)化和存取速度優(yōu)化的考慮來表現(xiàn)nonstatic data members,并且保持和C語言struct數(shù)據(jù)配置的兼容性。它們把數(shù)據(jù)直接存放在每一個class object之中。對于繼承而來的nonstatic data members(不管是virtual還是nonvirtual base class)也是如此。不過沒有強(qiáng)制定義其間的排列順序。
至于static data members,則被放置在程序的一個global data segment中,不會影響個別class object的大小。在程序之中,不管該class被產(chǎn)生出多少個objects(經(jīng)由直接產(chǎn)生或間接派生),static data members永遠(yuǎn)只存在一份實例(甚至即使該class沒有任何object實例,其static data members也已存在)。但是一個template class的static data members的行為稍有不同。
Data Member的綁定(The Binding of a Data Member)
C++ Standard以“member scope resolution rules”來精煉這個“rewriting rule”,其效果是,如果一個inline函數(shù)在class聲明之后立即被定義的話,那么就還是對齊評估求值(evaluae)。也就是說,當(dāng)一個人寫下這樣的代碼:
extern int x;class Point3d{public: //對于函數(shù)本身的分析將延遲直至class聲明的右大括號出現(xiàn)才開始 float X() const { return x; } //...private: float x; };//事實上,分析在這里運行
時,對于member functions本身的分析,會直到整個class的聲明都出現(xiàn)了才開始。
因此,在一個inline member function軀體之內(nèi)的一個data member綁定操作,會在整個class聲明之后才發(fā)生。