Data 語義學(xué)

一個(gè)class的data members,一般而言,可以表現(xiàn)這個(gè)class在程序執(zhí)行時(shí)的某種狀態(tài)。Nonstatic data members放置的是“個(gè)別的class object”感興趣的數(shù)據(jù),static data members則放置的是“整個(gè)class”感興趣的數(shù)據(jù)。

C++對(duì)象模型盡量以空間優(yōu)化和存取速度優(yōu)化的考慮來表現(xiàn)nonstatic data members,并且保持和C語言struct數(shù)據(jù)配置的兼容性。它們把數(shù)據(jù)直接存放在每一個(gè)class object之中。對(duì)于繼承而來的nonstatic data members(不管是virtual還是nonvirtual base class)也是如此。不過沒有強(qiáng)制定義其間的排列順序。
至于static data members,則被放置在程序的一個(gè)global data segment中,不會(huì)影響個(gè)別class object的大小。在程序之中,不管該class被產(chǎn)生出多少個(gè)objects(經(jīng)由直接產(chǎn)生或間接派生),static data members永遠(yuǎn)只存在一份實(shí)例(甚至即使該class沒有任何object實(shí)例,其static data members也已存在)。但是一個(gè)template class的static data members的行為稍有不同。

Data Member的綁定(The Binding of a Data Member)

C++ Standard以“member scope resolution rules”來精煉這個(gè)“rewriting rule”,其效果是,如果一個(gè)inline函數(shù)在class聲明之后立即被定義的話,那么就還是對(duì)齊評(píng)估求值(evaluae)。也就是說,當(dāng)一個(gè)人寫下這樣的代碼:

extern int x;class Point3d{public:    //對(duì)于函數(shù)本身的分析將延遲直至class聲明的右大括號(hào)出現(xiàn)才開始 
    float X() const { return x; }    //...private:    float x;
};//事實(shí)上,分析在這里運(yùn)行

時(shí),對(duì)于member functions本身的分析,會(huì)直到整個(gè)class的聲明都出現(xiàn)了才開始。
因此,在一個(gè)inline member function軀體之內(nèi)的一個(gè)data member綁定操作,會(huì)在整個(gè)class聲明之后才發(fā)生。

網(wǎng)友評(píng)論